2016-12-19 4 views
3

Ich versuche, eine Funktion, die einen generischen Parameter verwendet, einer Variablen zuzuweisen.Zuweisen einer Funktion mit generischem Parameter zu einer Variablen

Ich habe eine Klasse, Lautsprecher, mit einer Funktion, saySomething. Die saySomething Funktion soll als Parameter eines beliebiges Objekt entspricht, das Protokoll SpeakProtocol nehmen:

class Loudspeaker { 
    func saySomething<T:SpeakProtocol> (speaker:T) { 
     print("\(speaker.thinkOfSomethingToSay())") 
    } 
} 

protocol SpeakProtocol { 
    func thinkOfSomethingToSay() -> String 
} 

Die ThingSayer Klasse implementiert SpeakProtocol:

class ThingSayer:SpeakProtocol { 
    func thinkOfSomethingToSay() -> String { 
     return "Hello" 
    } 
} 

Ich erstelle ein neues Mitglied der Lautsprecherklasse:

var aLoudspeaker:Loudspeaker 

Und ich würde die saySomething-Funktion (nicht das Ergebnis dieser Funktion) auf eine Variable zuweisen:

var speakFunction = aLoudspeaker.saySomething 

dann würde ich diese Funktion an anderer Stelle aufrufen, indem Sie einen ThingSayer Erstellen und nebenbei, dass zu speakFunction:

var aSpeaker:Thingsayer 
speakFunction(speaker:thingSayer) 

Das Problem mit dieser Linie ist:

var speakFunction = aLoudspeaker.saySomething 

Was mich einen Fehler gibt: "Generischer Parameter 'T' konnte nicht abgeleitet werden."

Ich habe schon lange mit dem Kopf gegen eine Wand geschlagen. Gibt es eine Möglichkeit, das zu tun, was ich versuche?

Dies ist offensichtlich ein künstliches Beispiel, aber der Kern des Problems ist, dass ich eine Funktion habe, die einen generischen Parameter nimmt, und ich möchte diese Funktion einer Variablen zuweisen an anderer Stelle in meinem Code aufgerufen werden. Jede Hilfe würde sehr geschätzt werden.

+1

Mögliches Duplikat von [Ist es möglich, einer Variablen eine generische Funktion zuzuweisen?] (Http://stackoverflow.com/questions/40694060/is-it-possible-to-assign-a-generic-function-to) -a-variable) – dfri

+0

Ja, das scheint das gleiche Problem zu sein. – Mike

Antwort

1
var speakFuction: (speaker: ThingSayer) -> Void = aLoudspeaker.saySomething 

Sie müssen den Typ Ihrer Funktion explizit angeben, wenn Sie die Variable deklarieren, um den Compiler zu unterstützen.

+0

Dies scheint zu funktionieren, aber was ist, wenn ich die Funktion später mit einem anderen Speaker (der auch SpeakProtocol entspricht) aufrufen möchte? Ist so etwas möglich, deshalb habe ich zuerst versucht, einen generischen Parameter zu verwenden. Aber wenn ich in eine Klasse eingeschlossen bin, dann scheint es keinen großen Wert zu haben, in diesem Fall Generika zu verwenden. – Mike

+0

Warum definieren Sie nicht 'saySomething' als' func saySomething (Speaker: SpeakProtocol) '? (ohne das generische) – tomahh

+0

Können Sie auf diese Weise ein Protokoll als Parametertyp festlegen? – Mike

Verwandte Themen