如何在 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
,这表明它把它当作一个可选字符串数组而不是一个可选字符串数组(这有点傻)。
不可能有一个可选的可变参数。
该函数将始终接收可变参数的数组。
但是,数组可以为空,或者数组中的值可以为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
!
*/
我会像下面这样使用 compactMap 过滤 nil 值:
func myFunc(queryFormat: String?...) {
// queryFormat is now an optional-String array = [String?]
let queryFormat = queryFormat.compactMap { [=10=] }
// queryFormat is now a String array = [String]
print(queryFormat)
}
这可以称为:
myFunc(queryFormat: nil)
myFunc(queryFormat: "format")
myFunc(queryFormat: "format1", "format2")
输出将是:
[]
["format"]
["format1", "format2"]
是否可以在 Swift 中让可变参数成为可选参数?我尝试了两种有意义的方法,但都没有编译:
func myFunc(queryFormat: String?...) {
}
或
func myFunc(queryFormat: String...?) {
}
注意:从技术上讲,第一个实现可以编译,但如果您尝试解包它:
if let queryFormatUnwrapped = queryFormat {
...
}
你收到一个错误 Bound value in a conditional binding must be of Optional Type
,这表明它把它当作一个可选字符串数组而不是一个可选字符串数组(这有点傻)。
不可能有一个可选的可变参数。 该函数将始终接收可变参数的数组。
但是,数组可以为空,或者数组中的值可以为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
!
*/
我会像下面这样使用 compactMap 过滤 nil 值:
func myFunc(queryFormat: String?...) {
// queryFormat is now an optional-String array = [String?]
let queryFormat = queryFormat.compactMap { [=10=] }
// queryFormat is now a String array = [String]
print(queryFormat)
}
这可以称为:
myFunc(queryFormat: nil)
myFunc(queryFormat: "format")
myFunc(queryFormat: "format1", "format2")
输出将是:
[]
["format"]
["format1", "format2"]