2015-10-19 107 views
6

我想要做這樣的事情,但無法獲得正確的語法或在網絡上的任何地方找到正確的寫法:如果元素符合給定的協議,擴展數組以符合協議

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 
    } 
} 

所以我想符合Array到我的協議JSONDecodeable只有當這個數組的元素符合JSONCollectionElement

這可能嗎?如果是這樣,語法是什麼?

+0

使用泛型像陣

回答

4

這在Swift中是不可能的。您可以在標準庫中看到同樣的情況:Array在使用Equatable元素聲明時不會獲得Equatable一致性。

+1

任何更新爲SWIFT 4? –

+0

@OrkhanAlikhanov仍然不可能。我得到一個帶有約束的類型'數組'的擴展不能從XCode中產生繼承子句的構建時間錯誤。 – doplumi

0

我會建議使用包裝。例如

struct ArrayContainer<T: Decodable>: Container { 
    let array: [T] 
}