新手迅速。根据我的理解,元组赋值运算符'?'不允许使用元组。
var optionalTuple = (String, Int)? // this isn't allowed.
除了将元素分别指定为可选项之外,还有其他方法吗?
答案 0 :(得分:3)
(String, Int)?
是一种类型,而不是值,因此无法放在=
的右侧。
如果您还不知道,当您声明变量/常量时,可以使用以下语法指定其类型:
让/ var name:输入
因此可选的元组声明如下所示:
var optionalTuple: (String, Int)?
另一种方法是:
var optionalTuple = (String, Int)?.none
以上两个的值为nil
。您也可以将其初始化为自定义值:
var optionalTuple: (String, Int)? = ("Hello", 10)
另一种方法是:
var optionalTuple = (String, Int)?.some(("Hello", 10))
答案 1 :(得分:1)
元组可以声明为可选,但您似乎混淆了类型和值。
//Type is optional tuple (String, Int), value is nil
let optionalTuple : (String, Int)? = nil
//Type is optional tuple (String, Int), value is ("James", 27)
let optionalTuple : (String, Int)? = ("James", 27)
//Type is (inferred) optional tuple (String, Int). Value is ("James", 27)
let optionalTuple = ("James", 27)
通过一些单元测试,您可以自己运行并查看:
func testTupleOptionality() {
func returnOptionalTuple(returnNil:Bool) -> (String, Int)? {
if returnNil {
return nil
}
else {
return ("James", 27)
}
}
let result1 = returnOptionalTuple(returnNil: true)
XCTAssertNil(result1)
let result2 = returnOptionalTuple(returnNil: false)
XCTAssertNotNil(result2)
XCTAssertEqual(result2!.0, "James")
XCTAssertEqual(result2!.1, 27)
}
func testTupleOptionalityVariable() {
let optionalTuple : (String, Int) = nil
XCTAssertNil(optionalTuple)
}