2016-04-28 4 views
4

私はThoughtbotのArgoフレームワークを使用してJSONオブジェクトをモデルに解析しています。Argoのジェネリック型のデコード

私はそう

protocol SomeProtocol { 
    associatedtype Model 
    func foo()  
} 

extension SomeProtocol where Model: Decodable { 
    func foo() -> Model? { 
     // someJSON is AnyObject in this case, say, from a network call 
     guard let model: Model = decode(someJSON) else { return nil } 
     return model 
    } 
} 

のようなプロトコルとその拡張子を持って問題に実行していることだし、このプロトコルに準拠したクラスは、この

class SomeClass: SomeProtocol { 
    typealias Model = ArgoModel 

    func bar() { 
     print(foo()) 
    } 
} 

とモデルのようになりますこのように

struct ArgoModel { 
    let id: String 
} 

extension ArgoModel: Decodable { 
    static func decode(j: AnyObject) -> Decoded<ArgoModel> { 
     return curry(self.init) 
      <^> j <| "id" 
    } 
} 

(これらのカレーライブラリも使用していますが、ini tメソッド)

私が抱えている問題は、SomeProtocol拡張で、関連する型ModelがArgoによってデコードできないということです。私が得るエラーは

No 'decode' candidates produced the expected contextual result type 'Self.Model?' 

です。これはSwift型システムの制限ですか?それとも私は行方不明のものがありますか?

答えて

1

さらに調査したところ、これはSwift 2.3のようなSwift型システムの限界だと思われます。問題の正確な理由は、コレクションやモナドなどのコンテキストタイプがArgoのDecodableに準拠できないことです。だから私のモデルはコレクションに含まれていない限り動作します。スウィフト3.0では、目標は、この問題に見られるよう

(すなわち、Equatable要素の配列がEquatableある)

制約拡張は、新しいプロトコルに準拠できるようにする機能をできるようにすることです: https://github.com/thoughtbot/Argo/issues/334

私の現在の回避策は、モデルの配列を含む複数のモデルを作成し、をSomeProtocol拡張子にデコードすることです。だから今、私のモデルは次のようになります。

struct ArgoModels { 
    let models: [ArgoModel] 
} 

extension ArgoModels: Decodable { 
    static func decode(j: JSON) -> Decoded<ArgoModels> { 
     switch j { 
      case .Array(let a): 
       return curry(self.init) <^> sequence(a.map(ArgoModel.decode)) 
      default: 
       return .typeMismatch("Array", actual: j) 
     } 
    } 
} 

struct ArgoModel { 
    let id: String 
} 

extension ArgoModel: Decodable { 
    static func decode(j: AnyObject) -> Decoded<ArgoModel> { 
     return curry(self.init) 
      <^> j <| "id" 
    } 
} 

次に実装するクラスでは、私はどちらかの単一のオブジェクトまたは一般的な方法でそれらのコレクションを指定できtypealias、モデルを作ることができます。

関連する問題