【问题标题】:How to specify a variadic (ellipsis) parameter as optional in Swift?如何在 Swift 中将可变参数(省略号)参数指定为可选参数?
【发布时间】:2015-05-21 21:30:12
【问题描述】:

在 Swift 中是否可以有一个可变参数是可选的?我尝试了两种有意义的方法,但都没有编译:

func myFunc(queryFormat: String?...) {

}

func myFunc(queryFormat: String...?) {

}

注意:第一个实现在技术上可以编译,但如果您尝试解包:

if let queryFormatUnwrapped = queryFormat {
...
}

你得到一个错误Bound value in a conditional binding must be of Optional Type,这表明它把它当作一个可选字符串数组而不是一个可选字符串数组(这有点傻)。

【问题讨论】:

  • 你会检查数组是否为空吗?
  • 正如@Tobias 建议的那样,没有办法使 整个参数包 可选。那意味着什么?用户可以提供零个或多个以数组形式到达的参数。该数组如何/为什么是可选的?另一方面,参数它们自己可以是可选的。

标签: ios swift optional-parameters variadic-functions


【解决方案1】:

我会使用下面的 compactMap 过滤 nil 值:

func myFunc(queryFormat: String?...) {
    // queryFormat is now an optional-String array = [String?]

    let queryFormat = queryFormat.compactMap { $0 }
    // queryFormat is now a String array = [String]

    print(queryFormat)
}

这可以称为:

myFunc(queryFormat: nil)
myFunc(queryFormat: "format")
myFunc(queryFormat: "format1", "format2")

输出将是:

[]
["format"]
["format1", "format2"]

【讨论】:

    【解决方案2】:

    不可能有一个可选的可变参数。 该函数将始终接收可变参数的数组。

    但是,数组可以为空,或者数组中的值可以为 nil。

    我把一些示例代码放在一起,希望它有助于传达我想说的话。

    func vardicPrint(strings: String...) {
        if strings.isEmpty {
            print("EMPTY")
        } else {
            for string in strings {
                print(string)
            }
        }
    }
    
    func optionalPrint(maybeStrings: String?...) {
        if maybeStrings.isEmpty {
            print("EMPTY")
        } else {
            for string in maybeStrings {
                if let string = string {
                    print(string)
                } else {
                    print("nil")
                }
    
            }
        }
    }
    
    vardicPrint("Hello", "World", "!")
    vardicPrint()
    
    
    var nilString: String?
    optionalPrint("Goodbye", nilString, "World", "!")
    
    /* OUTPUT:
    Hello
    World
    !
    EMPTY
    
    Goodbye
    nil
    World
    !
    */
    

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2016-06-12
      • 2014-01-27
      • 2019-09-10
      • 2012-12-29
      相关资源
      最近更新 更多