2016-06-04 7 views
3

Ich füge eine UISwitch auf folgende Weise:Wert des Typs 'NSObject ->() -> PostFeed' kann nicht in den erwarteten Argumenttyp 'AnyObject?' Konvertiert werden.

let anonSwitch : UISwitch = { 
    let mySwitch = UISwitch() 
    mySwitch.on = false 
    mySwitch.setOn(false, animated: false); 
    mySwitch.tintColor = UIColor(red: (69/255.0), green: (209/255.0), blue: (153/255.0), alpha: 1.0) 
    mySwitch.addTarget(self, action: #selector(handleAnonSwitch), forControlEvents: .ValueChanged) 

    return mySwitch 
}() 

Jetzt auf dem self Schlüsselwort ich in mySwitch.addTarget die folgende Fehlermeldung erhalten:

Cannot convert value of type 'NSObject ->() -> PostFeed' to expected argument type 'AnyObject?' 

Ich benutze self in allen meinen anderen addTarget Funktionen für UIButton und ich nie diesen Fehler

Antwort

12

Ändern Sie Ihre let in eine lazy var.

Ich bin nicht sicher genau das, was der Compiler denkt (oder wo seine verrückten Fehlermeldung herkommt), aber meine Vermutung ist dies:

In Swift, Variablen, die sind let bevor Sie initialisiert werden müssen kann self verwenden. Ein Grund dafür ist, dass der Compiler nicht verifizieren kann, dass addTarget(action:forControlEvents:) nicht versuchen wird, anonSwitch() auf was auch immer es für target ruft, oder etwas anderes, wie Zugriff auf eine andere Variable, die nach anonSwitch initialisiert werden würde, die davon abhängt Initialisierung für dieses Objekt abgeschlossen.

lazy var Verwendung bedeutet, dass der Compiler überprüfen können, dass der Wert auf anonSwitch zugewiesen wird nicht zugegriffen werden, bevor self ein gültiges Objekt ist, weil es nicht möglich sein wird, anonSwitch zu nennen, bis alle anderen Mitglieder der Klasse initialisiert wurden .

Verwandte Themen