有没有办法使用相同的变量名链接多个if-let语句?

Kev*_*566 6 swift

比方说,我有三个可选的字符串,string1string2,和string3。我不知道哪一个不是(如果有的话),nil所以我正在使用if-let语句,然后我想对那个非null的字符串做一些事情,而不管它是哪个。

现在,这可以在Swift中使用,但是很麻烦:

if let newString = string1 {
   doSomething()
} else if let newString = string2 {
   doSomething()
} else if let newString = string3 {
   doSomething()
}
Run Code Online (Sandbox Code Playgroud)

我可以做类似的事情(这给我一个错误):

if let newString = string1 || let newString = string2 || let newString = string3 {
   doSomething()
}
Run Code Online (Sandbox Code Playgroud)

May*_*ace 7

解决方案1

if let newString = [string1, string2, string3].compactMap({$0}).first {
    print(newString)
}
Run Code Online (Sandbox Code Playgroud)

compactMap函数将生成一个非空值数组,您将获取first它的值

解决方案2

if let newString = [string1, string2, string3].first(where: {$0 != nil}) {
  print(newString)
}
Run Code Online (Sandbox Code Playgroud)

注意:正如@Connor和@vacawama提出的出色解决方案所建议的那样,上述解决方案将生成一个double可选(第一个可选项来自可选数组,然后该first函数构成第二个可选项)。可以通过以下任一方法解决此问题:

  1. if let newString = [str1, str2, str3].first(where: {$0 != nil}) as? String {

  2. if let newString = [str1, str2, str3].first(where: {$0 != nil}) ?? nil {

  3. if case let newString?? = [str1, str2, str3].first(where: {$0 != nil}) {

  4. if let first = [str1, str2, str3].first(where: { $0 != nil }), let newString = first

解决方案3

(这不会扩展,坦率地说,这很奇怪)

if let newString = string1 ?? string2 ?? string3 {
   print(newString)
}
Run Code Online (Sandbox Code Playgroud)