2015-10-17 18 views

Trả lời

7

Trong

s.addListener("key", callback: { a, b in print("success") }) 

trình biên dịch có thể suy ra các loại đóng cửa từ bối cảnh, ví dụ từ loại của phương pháp addListener(). Nếu phương pháp đó là ví dụ khai báo là

func addListener(key : String, callback: (Int, Int) -> Void) 

sau đó trình biên dịch có thể suy ra rằng lập luận

{ a, b in print("success") 

là một đóng cửa lấy hai Int thông số và trở Void.

Trong

let cb = { a, b in print("success") } 

không có bối cảnh như vậy, do đó trình biên dịch không thể biết loại đóng cửa. Kiểu trả về có thể được suy ra là Void vì việc đóng bao gồm một biểu thức duy nhất, nhưng bạn phải chỉ định các loại tham số, ví dụ:

let cb = { (a : Int, b : Int) in print("success") } 
+0

Lời giải thích tuyệt vời. :) –

+0

Cảm ơn Martin. JBM –

+0

Ngoài ra, bạn nhận được lỗi này khi hàm gọi lại trả về một giá trị, nhưng bạn chưa nhập 'giá trị trả về' vào kết thúc ... –

2

Mở rộng câu trả lời tuyệt vời của @ MartinR.

Swift cần để có thể suy ra rằng cb là loại (Int, Int)->(), hoặc bạn rõ ràng có thể thiết lập các loại:

let cb: (Int, Int)->() = { a, b in print("success") } 

Sau đó, bạn có thể nhận thấy rằng ab là không sử dụng và thay thế chúng với _:

let cb: (Int, Int)->() = { _ in print("success") } 

Tại sao chúng ta có thể lấy đi một đơn _ khi chức năng nhận 2 tham số? Trong trường hợp này, Swift biết có 2 tham số, do đó, _ chiếm vị trí của bộ chứa tất cả các tham số. Nó thay thế (_, _).


Bạn có thể sử dụng _ với câu trả lời @ MartinR của:

let cb = { (_:Int, _:Int) in print("success") } 

hoặc bạn có thể viết nó thích:

let cb = { (_:(Int, Int)) in print("success") } 

có thể được đọc như:

cb lấy hai tham số kiểu Int mà nó bỏ qua và in "thành công"

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