2017-06-10 8 views
0

ich geschrieben habe, ein Protokoll wie:Swift Generika Bool ist nicht konvertierbar Bool

public protocol Protocol1 { 
    func execute<T, R>(req: T) -> Promise<R> 
} 

das Protokoll implementiert als unten an:

struct Implemented1 : Protocol1 { 
    func execute<String, Bool>(req : String) -> Promise<Bool> { 
     return Promise<Bool>() { fulfill, reject in 
     fulfill(true) 
    } 
} 

Ich erhalte folgende Fehlermeldung:

' Bool 'ist nicht konvertierbar zu' Bool '

Bitte helfen Sie mir zu verstehen, was das Problem ist.

+1

Wo ist erscheint der Fehler? Bei dem Versprechen? Wo ist Promise definiert? –

+0

@NateBirkholz Der Fehler kommt zur Erfüllung (wahr). und Promise ist von PromiseKit –

+1

Können Sie die Definition von 'Versprechen zeigen? Nur der Initialisierer sollte in Ordnung sein. – Sweeper

Antwort

4

Das Problem ist am Anfang der Methodendeklaration.

func execute<String, Bool> 

Wer hat Ihnen beigebracht, eine generische Methode auf diese Weise zu deklarieren?

Die generischen Parameter sollen in die <> s gehen, nicht tatsächliche Typen!

Um das Protokoll zu implementieren, benötigen Sie eine generische Methode, keine, die eine String akzeptiert und Bool zurückgibt. Der Compiler behandelt String und Bool als Namen der generischen Parameter anstelle der tatsächlichen Swift-Typen. Wenn also der Compiler sagt, dass Bool nicht in Bool konvertiert werden kann, bedeutet dies, dass der schnelle Bool-Typ nicht in den generischen Parameter Bool konvertiert werden kann.

Ich denke, was Sie brauchen, ist zugeordnete Typen.

public protocol Protocol1 { 
    associatedtype RequestType 
    associatedtype ResultType 
    func execute(req: RequestType) -> Promise<ResultType> 
} 

struct Implemented1 : Protocol1 { 
    typealias ResultType = Bool 
    typealias RequestType = String 
    func execute(req : String) -> Promise<Bool> { 
     return Promise { fulfill, reject in 
      fulfill(true) 
     } 
    } 
} 

P.S. dies:

Promise { fulfill, reject in 
    fulfill(true) 
} 

kann vereinfacht werden:

Promise(value: true) 
+0

Danke für die Korrektur mich. Ich glaube, dass Generika etwas ist, das ich mehr verstehen muss, da ich sehe, dass es anders funktioniert als in C#. Ich habe gerade angefangen, an swift zu arbeiten. –

+0

Nur eine kurze Abfrage. Wie kann ich einen Decorator um diese Implementierung herum hinzufügen und ihn in einem IOC-Container mit demselben Service-Protokoll registrieren? –

+1

Sorry, ich weiß nichts über IOC-Container. Ich schlage vor, dass Sie zuerst selbst recherchieren und eine weitere Frage stellen. @BalrajSingh – Sweeper

Verwandte Themen