@IBAction func helloClick(sender: AnyObject) {
sender.setTitle("Click", forState: UIControlState.Normal)
}
Il codice sopra riportato funziona correttamente. Ma setTitle
non è un metodo su AnyObject
? Non dovrebbe essere un errore in fase di compilazione?Perché Swift mi consente di chiamare setTitle su AnyObject?
Il compilatore sa che "setTitle2", ad esempio, non esiste e non lo compilerà. Quindi non mi permetterà di scrivere codice non sicuro. –
Ovviamente ti permetterà di scrivere codice non sicuro. Ti permetterà di scrivere '(NSArray() come AnyObject) .setTitle (" foo ", forState: .Normal)' che quasi sicuramente andrà in crash. Allo stesso modo, dato il tuo codice di esempio, ti permetterebbe di chiamare 'helloClick (NSArray())' che avrebbe un effetto simile. Ogni volta che usi AnyObject non è sicuro, a meno che non si assicuri sempre che l'operazione proposta sia sicura. Di solito lo si adatta in modo appropriato a qualcosa di più specifico. –
@IanWarburton: è possibile chiamare qualsiasi nome di metodo in cui era presente una dichiarazione del metodo '@ objc' con quel nome visibile al compilatore. Hai importato un'API con il nome del metodo 'setTitle:', ma non ha mai visto alcuna classe con un nome di metodo 'setTitle2:'. Se hai dichiarato una classe con un metodo '@ objc' con nome' setTitle2: ', allora sì, lo compilerebbe. – newacct