2014-06-05 54 views
6

我已经定义了一个协议与方法委托(可选类型没有解开的值)返回一个元组:返回元组从

protocol SMCalculatorDelegate { 

    func numbersToAdd() -> (Int, Int) 

} 

当我尝试在我的课像这样来调用这个对委托方法:

class SMCalculator: NSObject { 

    var delegate : SMCalculatorDelegate? 

    func add() { 

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

    } 

} 

我得到首发let myTuple...行引用该行代码的.numbersToAdd()部分下面的错误。

"Value of optional type '(Int, Int)?' not unwrapped; did you mean to use '!' or '?'?" 

为什么不能这样工作时,我可以提取元组没有像这样的错误?

let tuple = delegate?.numbersToAdd() 

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

回答

4

我仍然试图抓住一切,但它似乎是正确的行为。

应该delegate是零,你将会分配到零myTuple,因此你需要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) 

    } 

} 

作品对我来说

+0

你是正确的,这将删除生成错误,而逻辑是有道理的......但是,我仍然有麻烦访问元组的个人价值。如果我已经正确地阅读了文档,我*应该*然后能够去'println(myTuple.n1)',但是这会引发错误''(n1:Int,n2:Int)?'没有名为'n1''的成员 – Sammio2

+0

我更新了我的解决方案以显示如何访问可选变量。因为他们可以零,你需要使用'!'运算符来解开它们,这告诉编译器,您确信在代码中此处的值永远不会为零,或者您使用if结构来捕获值为零的情况。 – Jann

+1

哦,当然是!由于元组是可选的,因此元组内的值也是可选的。谢谢你的帮助!我的大脑在漫长的一周结束时被炸掉! – Sammio2