2015-10-08 10 views
21

swift 2では配列型を拡張したいと思います。私はJSONDecodableプロトコルを持っています。私がコンパイラに言いたいのは、ArrayJSONDecodableに適合させる場合、要素がArrayの場合はJSONDecodableです。ここでは、コードは次のとおりです。制約付きの配列の拡張は継承句を持つことができません - swift 2

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

extension Array: JSONDecodable where Element: JSONDecodable { 

} 

しかし、コンパイラはエラーを与える:「制約付きタイプのアレイの拡張が継承句を持つことができません」

をだから、この動作の種類を達成するために他の方法がありますか?

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] 
+0

を私が見つけたthis..twitter.com/jadengeller/status/644735717814349824「ラッパー構造体を書く」という意味は何ですか? – Austin

答えて

0

私はあなたがTwitterで見つけthe hintを考えるには、そのようなことを意味しますか?スウィフト3が拡張

extension Array: JSONDecodable where Element: JSONDecodable 

のように行うことはできませんが、その可能性が何をしている間、それはダニ

protocol JSONDecodable { 
    init(json: JSON) throws 
} 

を実行する必要があります。

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

どのように少し型消去について:

+0

これは回答としてマークする必要があります。 – bubuxu

関連する問題