2015-10-19 3 views
6

Ich möchte so etwas machen, kann aber die Syntax nicht richtig finden oder nirgendwo im Web finden, die den richtigen Weg zum Schreiben gibt:Array erweitern, um Protokoll zu entsprechen, wenn Element einem bestimmten Protokoll entspricht

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

Deshalb mag ich Array mein Protokoll JSONDecodeable nur entsprechen, wenn die Elemente dieses Arrays zu JSONCollectionElement entsprechen.

Ist das möglich? Wenn ja, wie lautet die Syntax?

+0

Verwenden Generika so etwas wie Array

Antwort

4

Dies ist in Swift noch nicht möglich. Sie können dasselbe in der Standardbibliothek passieren sehen: Array erhält keine Equatable Übereinstimmung, wenn es mit Equatable Elementen deklariert wird.

+1

Jedes Update zum schnellen 4? –

+0

@OrkhanAlikhanov immer noch nicht möglich. Ich bekomme eine 'Erweiterung des Typs 'Array' mit Constraints kann keinen Build-Zeit-Fehler der Vererbungsklausel von XCode haben. – doplumi

0

Ich würde vorschlagen, einen Wrapper zu verwenden. Zum Beispiel

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