2017-06-30 19 views
12

Mới đối với Swift. Tôi có hai đoạn dưới đây:Selector vs Action Swift 4

NotificationCenter.default.addObserver(self, 
    selector:#selector(ViewController.notificationReceived), 
    name: Notification.Name(rawValue: name), object: nil) 

@objc func notificationReceived(notification:Notification){ 
    let x = notification.userInfo! 
    print("\(x["name"]!)") 

} 

và cuối cùng

let x:UITapGestureRecognizer = UITapGestureRecognizer(target: self, 
    action: #selector(tapped)) 

self.addGestureRecognizer(x) 

func tapped(){ 
    print("tapped") 

    self.delegate!.theViewTapped() 

} 

Tại sao nó rằng đối với notificationCenter? Tôi có nghĩa vụ cung cấp thẻ @objc cho thông số selector nhưng không cho tham số hoạt động UITapGestureRecognizer?

Sự khác biệt chính xác giữa SelectorAction in Swift là gì?

+0

So sánh [Làm thế nào tôi có thể đối phó với phản đối suy luận @objc với #selector() trong Swift 4?] (Https://stackoverflow.com/q/44390378/2976878) - như OOPer nói, cả hai ví dụ đều yêu cầu phương thức đích là '@ objc'. – Hamish

Trả lời

9

Kiểm tra đề nghị này cho Swift 4: SE-0160 Limiting @objc inference

Theo mô tả trong đề xuất, đoạn mã thứ hai của bạn cũng cần @objc.

Trong thực tế, Swift 4 trình biên dịch kèm với Xcode 9 beta2 tạo ra lỗi này cho các dòng sử dụng #selector(tapped):

error: argument of '#selector' refers to instance method 'tapped()' that is not exposed to Objective-C

note: add '@objc' to expose this instance method to Objective-C

Có lẽ thứ hai của bạn là một chút quá cũ để sử dụng với Swift 4. Bạn nghĩ rằng tốt hơn tất cả các phương thức được gọi thông qua bộ chọn cần thuộc tính @objc.

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