繁体   English   中英

如何在 Swift 中将可变参数(省略号)指定为可选参数?

[英]How to specify a variadic (ellipsis) parameter as optional in Swift?

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

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

}

或者

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

}

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

if let queryFormatUnwrapped = queryFormat {
...
}

Bound value in a conditional binding must be of Optional Type收到错误Bound value in a conditional binding must be of Optional Type这向我表明它将其视为可选字符串数组而不是可选字符串数组(这有点愚蠢)。

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

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

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

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
!
*/

我会用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"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM