2015-06-23 13 views

risposta

16

Hanno fatto in modo che ovunque il tipo non-nullable ora è un tipo nonnull.

Come in precedenza il metodo NSMutableArray addObject era

- (void)addObject:(ObjectType)anObject 

e ora è stato cambiato in

- (void)addObject:(ObjectType nonnull)anObject 

Quindi significa che non è possibile passare un oggetto nullo (nil) a questo metodo. Allo stesso modo, nel tuo caso metodo

+ (instancetype nonnull) array 

non tornerà mai nil.

Riferimento: https://developer.apple.com/swift/blog/?id=25

9

nonnull è una parola chiave per indicare al compilatore che il valore restituito (o parametro o proprietà) non sarà mai nullo. Questo è stato introdotto in una versione precedente di Xcode per consentire una migliore interoperabilità tra i tipi opzionali di Obj-C e Swift.

È possibile saperne di più su the official Swift blog

+6

Intendi "mai * intenzionalmente * essere nullo". –

+1

Potrebbe essere nullo, ma la tua app è comunque in DS e al di là della speranza. Mi chiedo se qualcuno ha provato cosa succede quando si assegna nulla a un riferimento a un oggetto Swift. – gnasher729

+2

@ gnasher729 - Sulla base delle domande che vedo qui, le persone lo provano abbastanza spesso. –

0

annullabile e non nullo è stato introdotto per rendere Objective C e l'interoperabilità Swift più facile.

L'obiettivo C non fa alcuna differenza tra riferimenti opzionali e non opzionali. Quindi il compilatore Swift non può essere sicuro se un particolare riferimento al codice Objective C sia facoltativo o meno.

annotazione nullable è la stessa di opzionale in Swift. l'annotazione non nulla è la stessa di quella non opzionale in Swift.

La regola generale è un qualsiasi tipo semplice puntatore sarà assunta ad essere non nullo (per maggiori dettagli leggere the official Swift blog)

Vorrei anche dire che questa nuova annotazione sarà anche migliorare la qualità del codice Objective C Punto di vista. Di solito mi chiedo se l'app andrà in crash se passerà come parametro? Ad esempio:

id var; 
NSMutableArray *a = [NSMutableArray new]; 
[a addObject:var]; 

Il compilatore non dice nulla in questo caso e l'applicazione si bloccherà in fase di esecuzione! Ora con questa nuova annotazione vedrai un avviso in fase di compilazione. So che questo esempio è stupido, ma ci sono alcuni casi che non si sa se è necessario verificare se una proprietà è nulla prima di chiamare un metodo a meno che non si legge la documentazione.

+1

Nel tuo esempio, penso che sia importante notare che l'applicazione si blocca solo a causa dell'eccezione lanciata da NSMutableArray. Il fatto che l'argomento dell'oggetto sia annotato come nonnull non rende l'app in crash con un'eccezione (sfortunatamente). Tendo a convalidare i miei input per nil ancora con i miei metodi pubblici e lanciare le mie proprie eccezioni descrittive piuttosto che andare in crash più tardi per ragioni più difficili da diagnosticare. –

3

nonnull è una parola chiave che notifica al compilatore che il valore restituito da oggetto/parametri non sarà mai nil.

In generale, si dovrebbe guardare a annullabile e non nullo o meno il modo in cui attualmente in uso affermazioni o eccezioni: violare il contratto è un errore di programmazione. In particolare, i valori di ritorno sono qualcosa che si controlla , quindi non si dovrebbe mai restituire nil per un tipo di ritorno non annullabile a meno che non sia compatibile con le versioni precedenti.