Ios 从委托返回元组(可选类型的值未展开)

Ios 从委托返回元组(可选类型的值未展开),ios,tuples,swift,Ios,Tuples,Swift,我定义了一个协议,其中包含一个返回元组的方法: protocol SMCalculatorDelegate { func numbersToAdd() -> (Int, Int) } 当我尝试对类中的委托方法调用此函数时,如下所示: class SMCalculator: NSObject { var delegate : SMCalculatorDelegate? func add() { let myTuple : (n1: Int,

我定义了一个协议,其中包含一个返回元组的方法:

protocol SMCalculatorDelegate {

    func numbersToAdd() -> (Int, Int)

}
当我尝试对类中的委托方法调用此函数时,如下所示:

class SMCalculator: NSObject {

    var delegate : SMCalculatorDelegate?

    func add() {

        let myTuple : (n1: Int, n2: Int) = delegate?.numbersToAdd()

    }

}
在引用该行代码的
.numbersToAdd()
部分时,我在开始的
let myTuple…
行中遇到以下错误

"Value of optional type '(Int, Int)?' not unwrapped; did you mean to use '!' or '?'?"
当我可以像这样毫无错误地提取元组时,为什么这不起作用

let tuple = delegate?.numbersToAdd()

println(tuple) //Prints (5,5)

我仍在努力掌握一切,但这似乎是正确的行为

如果
delegate
为nil,您将为myTuple分配nil,因此您还需要使myTuple成为可选的

class SMCalculator: NSObject {

   var delegate : SMCalculatorDelegate?

   func add() {

       let myTuple : (n1: Int, n2: Int)? = delegate?.numbersToAdd()

       // this works, because we're saying that myTuple definitely isn't nil
       println(myTuple!.n1)

       // this works because we check the optional value
       if let n1 = myTuple?.n1 {
           println(n1)
       } else {
           println("damn, it's nil!")
       }

       // doesn't work because you're trying to access the value of an optional structure
       println(myTuple.n1)

   } 

}

适用于我

您是正确的,这将删除构建错误,并且逻辑合理。。。然而,我仍然在访问元组的各个值时遇到困难。如果我正确地阅读了文档,那么我应该能够转到
println(myTuple.n1)
,但这会引发错误
“(n1:Int,n2:Int)?”没有名为“n1”的成员。
我更新了解决方案,以显示如何访问可选变量。因为它们可以为零,所以你需要使用“!”运算符来展开它们,这会告诉编译器,在代码中的这一点上,您确定值永远不会为零,或者您使用if结构来捕捉值为零的情况。哦,是的,当然!!由于元组是可选的,因此元组中的值也是可选的。谢谢你的帮助!漫长的一周快结束了,我的脑子都快炸了!