Kể từ Swift 2.0 có vẻ như chúng ta có thể tiến gần hơn đến các phần mở rộng của các kiểu generic áp dụng cho các tình huống được xác định trước.Swift "where" Array Extensions
Mặc dù chúng tôi vẫn không thể làm điều này:
protocol Idable {
var id : String { get }
}
extension Array where T : Idable {
...
}
... bây giờ chúng ta có thể làm điều này:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
...
}
}
... và Swift ngữ pháp chấp nhận nó. Tuy nhiên, đối với cuộc sống của tôi, tôi không thể tìm ra cách làm cho trình biên dịch hài lòng khi tôi điền vào các nội dung của hàm ví dụ. Giả sử tôi được như rõ ràng càng tốt:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
return self.filter { (item : T) -> Bool in
return item.id == id
}
}
}
... trình biên dịch sẽ không chấp nhận việc đóng cửa được cung cấp để lọc, phàn nàn
Không thể gọi 'lọc' với một danh sách đối số kiểu ' ((T) -> Bool) '
Tương tự nếu mục được chỉ định là Đáng tin cậy. Có ai may mắn ở đây không?
Ah có ý nghĩa cảm giác hoàn hảo, cảm ơn bạn cho việc học tập :) –
@ yo.ian.g: Bạn được hoan nghênh! –
Có cách nào để làm điều này với các loại không giao thức, như 'mở rộng mảng nơi Iterator.Element: CGRect'? –