2016-03-24 14 views
7

Trong đoạn mã sau, lý do tại sao Xcode đề xuất "Sử dụng #selector thay vì xây dựng một Bộ chọn một cách rõ ràng" là gì?Sử dụng #selector thay vì xây dựng một Bộ chọn

// addButton = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Add, 
//    target: self, action: #selector(FoldersMaintenanceVC.addButtonPressed)) 
addButton = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Add, 
      target: self, action: Selector("addButtonPressed")) 

self.navigationItem.leftBarButtonItem = addButton 

func addButtonPressed() 
{ 
    myNslogSys2(self, funcName:#function) 
} 

Trả lời

9

Nó khuyên bạn nên sử dụng Swift 2.2 new #selector vì nó là nhiều loại an toàn kể từ khi bạn không thể làm cho một tài liệu tham khảo chọn để một-không hiện phương pháp trong khi với Selector (String), bạn có thể tham khảo một không tồn tại.

+0

Có một lỗ hổng trong việc này mặc dù. Nếu tôi cung cấp một lớp sai có một phương pháp hiện có nhưng mục tiêu dự định của tôi - tự, vv không có phương pháp hiện có này, nó sẽ sụp đổ vào thời gian chạy. – user523234

+0

Tôi có thể làm gì nếu tôi muốn làm một cái gì đó như thế này: nếu responder! .respondsToSelector (Selector ("aMethod:")) == true {...} –

+0

@KyleKIM Nếu aMethod đến từ một lớp hoặc một giao thức và là không phải là tùy chọn, có thể là một cái gì đó giống như 'nếu cho responder = responder như? Giao thức {responder.aMethod (value)} 'Hoặc ngược lại' nếu trả lời! .respondToSelector (#selector (Protocol.aMethod (_ :)) {...} ' – Valentin

5

Sử dụng #selector hiện là cách chính xác trong Swift để tham khảo bộ chọn. Sử dụng cấu trúc Selector và chuỗi ký tự cho các bộ chọn, chẳng hạn như "mySel:" đã không được chấp nhận.

#selector mới hiện được nhập an toàn và cho phép kiểm tra trình biên dịch và tự động hoàn thành công cụ chọn mà bạn đang chuyển. Điều này sửa lỗi sai phổ biến của lỗi chính tả trong bộ chọn của bạn (trong trường hợp chuỗi ký tự)

1

Nó xảy ra gây hiện xây dựng Selector từ xâu phản đối và sẽ được loại bỏ trong Swift 3,0

với sự ra đời của cú pháp #selector, chúng ta nên không dùng các sử dụng literals chuỗi để tạo thành bộ chọn. Lý tưởng nhất, chúng tôi có thể thực hiện việc không dùng trong Swift 2.2 và loại bỏ các cú pháp hoàn toàn từ Swift 3.

Bạn có thể đọc thêm chi tiết về sự thay đổi này ở đây https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md

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