web-dev-qa-db-de.com

Was ist in Ziel C nicht null?

Kann jemand erläutern, warum nonnull in iOS 9 eingeführt wurde?

Zum Beispiel ist die NSArray Methode + (instancetype)array; jetzt + (instancetype nonnull)array;

Siehe: https://developer.Apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

Handelt es sich um eine Funktion auf Ziel-C-Ebene, und wie würde sich dies auf die vorhandenen Apps auswirken?

14
Mehul Parmar

Sie haben sichergestellt, dass der Typ jetzt nonnull ist, wenn der Typ nicht nullfähig ist. 

Wie zuvor war NSMutableArray addObject Methode 

- (void)addObject:(ObjectType)anObject  

und jetzt wurde es geändert 

- (void)addObject:(ObjectType nonnull)anObject

Das bedeutet, dass Sie kein Nullobjekt (nil) an diese Methode übergeben können. Gleicher Weise in Ihrem Fall

+ (instancetype nonnull) array

die Methode gibt niemals nil zurück.

Referenz: https://developer.Apple.com/Swift/blog/?id=25

17
Mrunal

nonnull ist ein Schlüsselwort, das dem Compiler mitteilt, dass der Rückgabewert (oder der Parameter oder die Eigenschaft) niemals null sein wird. Dies wurde in einer früheren Version von Xcode eingeführt, um eine bessere Interoperabilität zwischen den optionalen Typen von Obj-C und Swift zu ermöglichen.

Mehr darüber erfahren Sie auf dem offiziellen Swift-Blog

9
rounak

nonnull ist ein Schlüsselwort, das den Compiler darüber informiert, dass der von object/parameters zurückgegebene Wert niemals nil ist.

Im Allgemeinen sollten Sie nullwerte und nicht-ungefähr so ​​betrachten, wie Sie derzeit Assertionen oder Ausnahmen verwenden: Bei einem Vertragsbruch ist Ein Programmierfehler. Insbesondere sind Rückgabewerte etwas, das Sie Steuern. Daher sollten Sie niemals Null für einen nicht-nullwertfähigen Rückgabetyp Zurückgeben, es sei denn, dies ist für die Rückwärtskompatibilität gedacht.

3
Nilesh Patel

nullable und nonull wurde eingeführt, um die Interoperabilität zwischen Objective C und Swift zu vereinfachen. 

Ziel C unterscheidet nicht zwischen optionalen und nicht optionalen Referenzen. Der Swift-Compiler kann dann nicht sicher sein, ob ein bestimmter Verweis auf Objective C-Code optional ist oder nicht.

die annullierbare Annotation ist in Swift die gleiche wie die optionale. Die Nichtnull-Annotation ist in Swift die gleiche wie die nicht optionale.

Als Faustregel gilt, dass für einen einfachen Zeigertyp kein Wert angegeben wird (weitere Informationen finden Sie unter dem offiziellen Swift-Blog ).

Ich würde auch sagen, dass diese neue Anmerkung auch die Codequalität aus Sicht von Objective C verbessern wird. Normalerweise frage ich mich, ob die App abstürzt, wenn ein Parameter als Null übergeben wird. Zum Beispiel:

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

Der Compiler sagt in diesem Fall nichts aus und Ihre Anwendung wird in der Ausführungszeit abstürzen! Mit dieser neuen Anmerkung wird jetzt eine Warnung in der Kompilierungszeit angezeigt. Ich weiß, dass dieses Beispiel dumm ist, aber es gibt Fälle, in denen Sie nicht wissen, ob Sie vor dem Aufruf einer Methode prüfen müssen, ob eine Eigenschaft gleich null ist oder nicht, es sei denn, Sie lesen die Dokumentation.

0
agy