1

Response クラスに値が含まれており、Value クラスにも Mappable プロトコルに準拠するデータが含まれています。

これで、Response オブジェクトを処理する関数ができましたが、Value オブジェクトからデータを取得しようとすると、Type "R" がプロトコルに準拠していません。

これは遊び場での私のコードです:

アップデート

protocol Mappable{
    func doSomething()
}

class User: Mappable {
    func doSomething() {

    }
}

class Book: Mappable {
    func doSomething() {

    }
}

class Value<T: Mappable>: Mappable{
    var data: T?

    func doSomething() {

    }
}

class Response<T>{
    var value: T?
}

func handleResponse< R: Mappable, T:Value<R>>(response:Response<T>, completeHandler: (R?, NSError?)->()){
    completeHandler(response.value!.data, nil)  //error goes here: Type "R" does not conform to protocol Mappable

}


let response = Response<Value<User>>()
response.value = Value<User>()
response.value?.data = User()

let response2 = Response<Value<Book>>()
response2.value = Value<Book>()
response2.value?.data = Book()

handleResponse(response, completeHandler:{(r,e)in
    print(r)
})

handleResponse(response2, completeHandler:{(r,e)in
    print(r)
})

私はそれを正しくやっていますか?またはこれを達成するための他の方法。ありがとう

4

2 に答える 2

2

コードが機能しない理由がよくわかりません。Swift がジェネリック内のジェネリックの型を推測するのに苦労しているためだと思います。

responseの新しいジェネリックを定義するのではなく、型自体をラップすることでコンパイルすることができましたValue<R>。例えば:

func handleResponse<R: Mappable>(response:Response<Value<R>>, completeHandler: (R?, NSError?)->()){
    completeHandler(response.value!.data, nil)
}

元のコードが機能しない理由を他の誰かが正確に知っているかどうか知りたいです!

于 2016-04-20T19:56:54.630 に答える