2015-05-22 25 views
22

Tôi có một giao thức nhanh chóng:Kiểm tra xem phương thức giao thức tùy chọn có được triển khai trong Swift không?

@objc protocol SomeDelegate { 

    optional func myFunction() 

} 

tôi một trong các lớp học của tôi, tôi đã làm:

weak var delegate: SomeDelegate? 

Bây giờ tôi muốn kiểm tra xem delegatemyFunction thực hiện.

Trong Objective-C tôi có thể làm:

if ([delegate respondsToSelector:@selector(myFunction)]) { 
... 
} 

Nhưng điều này không có sẵn trong Swift.

Chỉnh sửa: Điều này khác với: What is the swift equivalent of respondsToSelector? Tôi tập trung vào các giao thức lớp không có trên lớp học.

Làm cách nào để kiểm tra xem đại biểu của tôi có triển khai phương pháp tùy chọn không?

+0

Bạn có chắc chắn rằng http://stackoverflow.com/a/27665147/1187415 này hoặc câu trả lời http://stackoverflow.com/a/28078301/1187415 này cho chuỗi được tham chiếu không trả lời câu hỏi của bạn không? –

+0

Hiện tại phiên bản Swift nào không có sẵn khi câu hỏi được hỏi, nhưng trong 2.2 nhanh bạn có thể sử dụng respondsToSelector –

Trả lời

23

mỗi The Swift Programming Language:

Bạn kiểm tra xem có một thực hiện một yêu cầu bắt buộc bằng cách viết một dấu hỏi sau khi tên của yêu cầu khi nó được gọi là, như someOptionalMethod? (SomeArgument). Tùy chọn thuộc tính tùy chọn và yêu cầu phương thức tùy chọn trả về giá trị, sẽ luôn trả về giá trị tùy chọn của loại thích hợp khi họ truy cập hoặc gọi để phản ánh thực tế yêu cầu tùy chọn.

Vì vậy, ý định không phải là bạn kiểm tra xem phương pháp được triển khai hay không, đó là bạn cố gắng gọi nó bất kể và nhận lại tùy chọn.

+0

Tôi muốn kiểm tra xem các phương thức tùy chọn có tồn tại trước khi tôi gọi nó không. – confile

+2

Sau đó, bạn có thể không muốn sử dụng Swift. Nó không phải là những gì ngôn ngữ được chế tác để hỗ trợ. Trường hợp sử dụng thực tế của bạn là gì? – Tommy

+2

@confile: Hãy xem * tất cả * câu trả lời cho "câu hỏi trùng lặp", ví dụ: câu hỏi này: http://stackoverflow.com/a/27665147/1187415.Nó cho thấy làm thế nào để kiểm tra đầu tiên nếu các đại biểu thực hiện phương pháp, và sau đó gọi nó. –

10

Bạn có thể làm

if delegate?.myFunction != nil { 

} 
+2

Còn phương pháp quá tải thì sao? Chúng ta có thể làm điều đó để kiểm tra một cái cụ thể không? –

+0

Điều này làm hỏng trình biên dịch trong Xcode 7.3 Beta nếu chức năng không phải là tùy chọn. Kỳ dị. –

7

tôi đã tìm thấy nó thành công thêm một mở rộng của giao thức định nghĩa thực hiện mặc định cơ bản và sau đó bất kỳ lớp thực hiện giao thức chỉ cần ghi đè lên các chức năng quan tâm.

public protocol PresenterDelegate : class { 
     func presenterDidRefreshCompleteLayout(presenter: Presenter) 
     func presenterShouldDoSomething(presenter: Presenter) -> Bool 
    } 

sau đó mở rộng

extension PresenterDelegate { 
     public func presenterDidRefreshCompleteLayout(presenter: Presenter) {} 
     public func presenterShouldDoSomething(presenter: Presenter) -> Bool { 
     return true 
     } 
    } 

Bây giờ bất kỳ lớp cần phải phù hợp với các giao thức PresenterDelegate có tất cả các chức năng đã được thực hiện, vì vậy nó bây giờ tùy chọn để ghi đè lên nó chức năng.

+0

Có vẻ rất hữu ích để biết, nếu tôi chỉ có thể nhớ nó khi tôi cần nó :-) – clearlight

+0

Vâng nhưng làm thế nào điều này làm việc nếu một số đoạn mã cần phải hành động chỉ khi chức năng được thực hiện? Và nó sẽ không biên dịch nếu '@ objc' được yêu cầu do một phần mã của giao thức gọi #selector vì nó đang làm gì đó với giao diện người dùng. Hừm. – xaphod

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