2014-06-05 20 views
6

tôi đã xác định một giao thức với một phương pháp để trả lại một tuple:Trở tuple Từ Đại biểu (Giá trị của loại tùy chọn không nào)

protocol SMCalculatorDelegate { 

    func numbersToAdd() -> (Int, Int) 

} 

Khi tôi cố gắng để gọi đây là so với phương pháp đại biểu trong lớp học của tôi như thế này :

class SMCalculator: NSObject { 

    var delegate : SMCalculatorDelegate? 

    func add() { 

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

    } 

} 

tôi nhận được lỗi sau trên dòng bắt đầu let myTuple... đề cập đến phần .numbersToAdd() đó dòng mã.

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

Tại sao điều này không hoạt động khi tôi có thể trích xuất bộ dữ liệu không có lỗi như thế này?

let tuple = delegate?.numbersToAdd() 

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

Trả lời

4

Tôi vẫn đang cố nắm bắt mọi thứ, nhưng có vẻ như hành vi đúng.

nên delegate được con số không, bạn sẽ gán nil để myTuple, do đó bạn cần phải thực hiện myTuple tùy chọn cũng ...

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) 

    } 

} 

công trình đối với tôi

+0

Bạn là chính xác, điều này loại bỏ các lỗi xây dựng , và logic có ý nghĩa ... Tuy nhiên tôi vẫn còn gặp khó khăn khi truy cập vào các giá trị riêng lẻ của bộ dữ liệu. Nếu tôi đã đọc các tài liệu một cách chính xác i * nên * chỉ đơn giản sau đó có thể đi 'println (myTuple.n1)' nhưng điều này làm tăng lỗi ''(n1: Int, n2: Int)?' không có thành viên có tên 'n1'' – Sammio2

+0

Tôi đã cập nhật giải pháp của mình để hiển thị cách truy cập các biến tùy chọn. Bởi vì họ có thể bằng nil bạn cần phải sử dụng '!' nhà điều hành để unwrap họ, mà nói với trình biên dịch mà bạn chắc chắn rằng giá trị là không bao giờ nil tại thời điểm này trong mã, hoặc bạn sử dụng cấu trúc nếu để nắm bắt các trường hợp đó giá trị là số không. – Jann

+1

Ồ vâng tất nhiên !! Vì tuple là tùy chọn nên các giá trị nằm trong tuple. Cảm ơn bạn đã giúp đỡ! Não của tôi được chiên vào cuối một tuần dài! – Sammio2

Các vấn đề liên quan