2015-10-08 9 views
21

W swift 2 Chcę rozszerzyć typ tablicy. Mam protokół JSONDecodable. Co chcę powiedzieć kompilatorowi jest zgodny Array do protokołu JSONDecodable, jeśli elementy Array są również JSONDecodable. Oto kod:Rozszerzenie typu Tablica z ograniczeniami nie może mieć klauzuli dziedziczenia - szybka 2

public protocol JSONDecodable { 
    static func createFromJSON(json: [String: AnyObject]) throws -> Self 
} 

extension Array: JSONDecodable where Element: JSONDecodable { 

} 

Ale kompilator daje błąd: „Rozbudowa typu Array z ograniczeniami nie może mieć klauzuli dziedziczenie”

Więc jest jakiś inny sposób, aby osiągnąć ten rodzaj zachowania?

+0

znalazłem this..twitter.com/jadengeller/status/644735717814349824 Każdy pomysł, co rozumie przez "napisanie struktury opakowania"? – Austin

Odpowiedz

0

myślę the hint znalazłeś na Twitterze oznacza coś takiego:

protocol X { 
    var xxx: String { get } 
} 

// This is a wrapper struct 
struct XArray: X { 

    let array: Array<X> 

    var xxx: String { 
     return "[\(array.map({ $0.xxx }).joinWithSeparator(", "))]" 
    } 

} 

// Just for this demo 
extension String: X { 
    var xxx: String { 
     return "x\(self)" 
    } 
} 

let xs = XArray(array: ["a", "b", "c"]) 
print(xs.array) // ["a", "b", "c"] 
print(xs.xxx) // [xa, xb, xc] 
7

jak o małym typu usunięciem? Należy zrobić kleszcza

protocol JSONDecodable { 
    init(json: JSON) throws 
} 

Chociaż Swift 3 nie pozwala zrobić jak przedłużenie

extension Array: JSONDecodable where Element: JSONDecodable 

ale jego możliwe do zrobienia:

extension Array: JSONDecodable { 
    init(json: JSON) throws { 
     guard let jsonArray = json.array, 
      let decodable = Element.self as? JSONDecodable.Type else { 
       throw JSONDecodableError.undecodable 
     } 

     self = jsonArray.flatMap { json in 
      let result: Element? = (try? decodable.init(json: json)) as? Element 
      return result 
     } 
    } 
} 
+0

To powinno być oznaczone jako odpowiedź. – bubuxu

Powiązane problemy