2014-06-22 14 views
8

Làm cách nào để tự tham chiếu chính xác trong một đóng cửa nhanh chóng?Tham chiếu chính xác tự trong dispatch_async

dispatch_async(dispatch_get_main_queue()) { 
    self.popViewControllerAnimated(true) 
} 

tôi nhận được lỗi:

Cannot convert the expression's type 'Void' to type 'UIViewController!"

ngẫu nhiên tôi đã cố gắng:

dispatch_async(dispatch_get_main_queue()) {() 
    self.popViewControllerAnimated(true) 
} 

và nó làm việc. Không chắc chắn những gì thêm() không! Bất cứ ai quan tâm để giải thích? Cảm ơn!

+0

Chấp nhận anwer nếu đúng, và nâng cấp nó nếu nó vượt quá mức mong đợi của bạn. – vrwim

Trả lời

4

Đây là vấn đề giống như mọi người đã chạy với những câu hỏi này:

What am I doing wrong in Swift for calling this Objective-C block/API call?

animateWithDuration:animations:completion: in Swift

Đây là ý tưởng chung:

Từ cuốn sách Swift: https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Closures.html

Một trong các tối ưu hóa của Đóng cửa là:

Implicit returns from single-expression closures

Do đó, nếu bạn chỉ có một dòng trong đóng, giá trị trả lại của bạn sẽ thay đổi. Trong trường hợp này, popViewController trả về bộ điều khiển chế độ xem đang bị xuất hiện. Bằng cách thêm () vào phần đóng, bạn chỉ cần đóng cửa 2 dòng và giá trị trả lại không còn tiềm ẩn nữa!

+0

Tôi không chắc chắn nếu điều này được tính là một câu hỏi trùng lặp do họ có cùng một vấn đề. Nếu có, hãy gắn cờ! – Jack

+0

Không trùng lặp. –

0

tôi đã trả lời một cái gì đó như thế này một vài ngày trước đây cho một vấn đề tái liên quan: 'value ngầm để đổi lấy việc đóng cửa đơn biểu hiện' Swift: animateWithDuration:animations:completion: in Swift

Trong trường hợp này, phương pháp popViewControllerAnimated trả về UIViewController được popped từ ngăn xếp: (https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popViewControllerAnimated :)

Mặc dù bạn không rõ ràng làm gì với giá trị trả về của phương thức đó, Swift đang sử dụng giá trị đó (giá trị trả về UIViewController) làm giá trị trả về đóng cửa đang mong đợi một giá trị trả về của Void.

Khi bạn thêm số parens bổ sung (), về cơ bản bạn đã thêm một dòng khác vào đóng và vì nó không còn là 'đóng biểu thức đơn' nữa nên nó không còn trả về UIViewController xuất hiện nữa.

Cộng đồng cuối cùng sẽ giải quyết theo quy ước để xử lý vấn đề này, hiện tại tôi đang vận động thêm return() vào cuối thời gian đóng (vì nó nêu rõ ý định, (1) đoản mạch 'trả về tiềm ẩn' bằng cách thêm một câu lệnh khác và (2) trả về một cách rõ ràng những gì được mong đợi).

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