2017-10-23 6 views
0

Wie kann ich type(of: someVar) als richtigen Typ in Swift verwenden?Wie kann ich Typ (von: someVar) als richtigen Typ in Swift verwenden?

Angenommen, ich habe einige generische Protokoll Auf Anfrage erhältlich:

protocol Decryptable: Decodable { 
    var cipher: Cipher 
} 
protocol Requestable { 
    associatedtype T 
    var schema: T 
} 
protocol Service { 
    static func invoke<R: Requestable>(_ request: R) -> Void where R.T: Decodable { 
    // impl. #1 
    } 
    static func invoke<R: Requestable>(_ request: R) -> Void where R.T: Decryptable { 
    // impl. #2 
    } 
} 
struct Request<T>: Requestable { 
    var schema: T 
} 

Dienst eine Anfrage, deren Schema aufrufen kann, ist Dekodierbare oder entschlüsselbar.

Da jedoch entschlüsselbar Dekodierbare entspricht, an anderer Stelle haben wir einige entschlüsselbar Wert, der upcast gewesen Dekodierbare wie:

let myDecodable = myDecryptable as Decodable 
// later... in a class that doesn’t know about myDecryptable... 
let myRequest = Request(schema: myDecodable) 
Service.invoke(myRequest) 

Wenn nun Dienst aufrufen hier aufgerufen wird, wird es dem Weg zur ersten Implementierung (# 1). D. h., Da die Anfrage mit dem upcasted-Wert "myDecodable" erzeugt wurde, wird invoke zur Implementierung # 1 gehen (als ob Request.T nur ein decodierbarer Typ ist, obwohl es decryptable ist, unter der Haube).

In der Tat, wenn ich Haltepunkte in XCode setze, weiß die Laufzeit klar, dass Request.T ist ein Decryptable Typ in jeder Situation, auch nachdem es Upcast wurde.

So innen Implementierung 1 habe ich versucht, einen Anruf viele Dinge zu leiten, wo das Schema Implementierung entschlüsselbar ist 2:

typealias ActualType: Decryptable = R.T 
if let downcastedRequest = request as? Request<ActualType> { 
    invoke(downcastedRequest) 
} 
// FAILS to compile  

let schemaType = type(of: request.schema) 
if let downcastedRequest = Request<schemaType>(schema: request.schema as? schemaType) { 
    invoke(downcastedRequest) 
} 
// FAILS to compile 


if let downcastedRequest = Request<type(of: request.schema)>(schema: request.schema as? type(of: request.schema)) { 
    invoke(downcastedRequest) 
} 
// FAILS to compile 

Bitte helfen, danke. (War ich dumm zu versuchen, Protokolle zu verwenden, mit dem dazugehörigen Typen Warum kann ich nicht Typen verwenden (von:? Schema), als ob es eine richtige Art hier war ..

+0

Beantwortet Ihre Frage nicht, aber es gibt ein 'Decodable'-Protokoll in Swift 4. Zur Verwendung mit der Deserialisierung Meines Erachtens hat Ihre' Decodable' mehr mit Kryptografie zu tun, richtig? –

Antwort

0

Verwendung == statt:

<...> 
where R.T == Decodable <...> 
where R.T == Decryptable <...> 
Verwandte Themen