2014-12-24 23 views
6

Tôi có một phương pháp chung trong một trong các lớp học của mình, nơi tôi muốn có một loại chung phù hợp với UIViewControllerUIPickerViewDelegate. Làm thế nào tôi có thể làm điều đó? Tôi đã nghĩ đến việc này:Loại chung loại Swift phù hợp với hai giao thức

func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {} 

Nhưng mã này không "nhận ra" UIPickerViewDelegate. Tôi cũng nghĩ đến việc sử dụng đường ống | thay vì dấu phẩy nhưng điều này thậm chí còn tồi tệ hơn, trình biên dịch không chấp nhận điều đó. Có thể thực hiện điều này hay tôi phải thực hiện 2 tham số cho lớp và giao thức? Hoặc có cách giải quyết tốt hơn không?

Nhờ sự giúp đỡ của bạn và Giáng sinh vui vẻ:]

Trả lời

12

Mã của bạn:

func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {} 

tuyên bố Generics thông số:

  • T đó là UIViewController. Và nó được sử dụng làm kiểu tham số viewController.
  • UIPickerViewDelegateAny. Và nó không được sử dụng.

Thay vào đó, bạn nên sử dụng "Where Clause", như:

func foo<T: UIViewController where T:UIPickerViewDelegate> (#viewController: T) {} 
+0

Cảm ơn bạn rất nhiều! Tôi không biết từ khóa 'where' có thể được sử dụng ở đâu. Nhưng bây giờ tôi có một vấn đề khác khi gọi phương thức này trong viewController của tôi (tuân theo UIPickerViewDelegate) bởi '.foo (viewController: self)' Tôi nhận được lỗi sau: 'Type 'UIViewController' không phù hợp với giao thức 'UIPickerViewDelegate''. Có chuyện gì vậy? Cảm ơn bạn đã giúp đỡ một lần nữa;) – borchero

+0

'lớp MyViewController: UIViewController, UIPickerViewDelegate {...}' hoạt động cho tôi. Làm thế nào để bạn khai báo viewController? – rintaro

+0

Tôi cũng có một số giao thức khác: 'UITableViewDataSource',' UITableViewDelegate', 'UIPickerViewDataSource' – borchero

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