2014-09-19 9 views

risposta

4

Questo fa parte della specifica del linguaggio (vedere la sezione id compatibility)

È anche possibile chiamare qualsiasi metodo Objective-C e accedere a qualsiasi proprietà (On ANYOBJECT) senza lanciare ad una più specifica tipo di classe.

Questo serve per facilitare l'interoperabilità Objective-C.

La guida afferma quanto segue anche:

Tuttavia, poiché il tipo specifico di un oggetto digitato come ANYOBJECT non è noto fino runtime, è possibile scrivere inavvertitamente codice non sicuro.

Ovviamente poiché la validità del codice è determinata solo in fase di esecuzione, questo può essere pericoloso.

+0

Il compilatore sa che "setTitle2", ad esempio, non esiste e non lo compilerà. Quindi non mi permetterà di scrivere codice non sicuro. –

+0

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. –

+2

@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

3

AnyObject si comporta in modo simile a Objective-C di id

Permette qualsiasi metodo per essere chiamato su di esso. Lo scopo di AnyObjectè per evitare errori di compilazione. È possibile chiamare qualsiasi metodo su un AnyObject e verrà compilato correttamente. Vedrai solo errori in runtime.

Per la documentazione,

Si può anche chiamare qualsiasi metodo Objective-C e accedere a qualsiasi proprietà (On ANYOBJECT) senza lanciare ad una più specifica tipo di classe.

Problemi correlati