2014-06-05 19 views
6

mam zdefiniowanej protokół z metodą powrotu krotki:Wracając krotka Od Delegata (wartość opcjonalnego typu nie nieowiniętym)

protocol SMCalculatorDelegate { 

    func numbersToAdd() -> (Int, Int) 

} 

Kiedy próbuję nazwać przeciwko metodzie delegata w mojej klasie jak ta :

class SMCalculator: NSObject { 

    var delegate : SMCalculatorDelegate? 

    func add() { 

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

    } 

} 

otrzymuję następujący błąd na linii startu let myTuple... odsyłający do sekcji .numbersToAdd() tej linii kodu.

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

Dlaczego to nie działa, gdy mogę wyodrębnić krotkę bez takiego błędu?

let tuple = delegate?.numbersToAdd() 

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

Odpowiedz

4

Nadal staram się opanować wszystko, ale wydaje się, że to prawidłowe zachowanie.

delegate powinno być zerowe, należy przypisać do myTuple nil, co trzeba zrobić myTuple opcjonalnego, jak również ...

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) 

    } 

} 

działa na mnie

+0

Masz rację, to usuwa błąd kompilacji , a logika ma sens ... Jednak wciąż mam problemy z dostępem do poszczególnych wartości krotki. Jeśli czytałem dokumenty poprawnie i * powinno * po prostu wtedy można przejść do 'println (myTuple.n1)' ale to podnosi błąd ''(n1: Int, n2: Int)?" nie ma członka o nazwie "n1", – Sammio2

+0

Zaktualizowałem moje rozwiązanie, aby pokazać, jak uzyskać dostęp do opcjonalnych zmiennych. Ponieważ mogą przez zero użyć "!" operator, aby je rozwinąć, co mówi kompilatorowi, że jesteś pewny, że wartość nigdy nie jest zerowa w tym momencie kodu, lub używasz struktury if, aby wychwycić przypadek, że wartość jest zerowa. – Jann

+1

O tak, oczywiście !! Ponieważ krotka jest opcjonalna, tak samo są wartościami w krotce. Dzięki za pomoc! Mój mózg jest smażony pod koniec długiego tygodnia! – Sammio2

Powiązane problemy