2015-10-19 17 views
6

Tôi muốn làm điều gì đó như thế này, nhưng không thể tìm đúng cú pháp hoặc tìm bất kỳ đâu trên web cung cấp đúng cách để viết nó:Mở rộng mảng để phù hợp với giao thức nếu Phần tử tuân theo giao thức đã cho

protocol JSONDecodeable { 
    static func withJSON(json: NSDictionary) -> Self? 
} 

protocol JSONCollectionElement: JSONDecodeable { 
    static var key: String { get } 
} 

extension Array: JSONDecodeable where Element: JSONCollectionElement { 
    static func withJSON(json: NSDictionary) -> Array? { 
     var array: [Element]? 
     if let elementJSON = json[Element.key] as? [NSDictionary] { 
      array = [Element]() 
      for dict in elementJSON { 
       if let element = Element.withJSON(dict) { 
        array?.append(element) 
       } 
      } 
     } 
     return array 
    } 
} 

Vì vậy, tôi muốn tuân thủ Array đối với giao thức của tôi JSONDecodeable chỉ khi các thành phần của mảng này tuân theo JSONCollectionElement.

Điều này có khả thi không? Nếu vậy, cú pháp là gì?

+0

Sử dụng Generics giống như Array

Trả lời

4

Điều này chưa thể thực hiện được trong Swift. Bạn có thể thấy điều tương tự xảy ra trong thư viện chuẩn: Array không đạt được độ tương thích Equatable khi được khai báo với các yếu tố Equatable.

+1

Mọi cập nhật nhanh chóng 4? –

+0

@OrkhanAlikhanov vẫn không thể. Tôi đang nhận được một 'Mở rộng kiểu 'Mảng' với những ràng buộc không thể có một lỗi thời gian xây dựng khoản' kế thừa từ XCode. – doplumi

0

Tôi khuyên bạn nên sử dụng trình bao bọc. Ví dụ:

struct ArrayContainer<T: Decodable>: Container { 
    let array: [T] 
} 
Các vấn đề liên quan