Swift 4:元组可选

时间:2017-08-10 08:57:31

标签: swift tuples

新手迅速。根据我的理解,元组赋值运算符'?'不允许使用元组。

var optionalTuple = (String, Int)? // this isn't allowed.  

除了将元素分别指定为可选项之外,还有其他方法吗?

2 个答案:

答案 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)
}