2015-06-23 5 views

Antwort

16

Sie haben dafür gesorgt, dass überall dort, wo der Typ nicht-nullable ist es jetzt ein nonnull Typ ist.

Wie frühere NSMutableArray addObject Methode war

- (void)addObject:(ObjectType)anObject 

und jetzt hat es zu

- (void)addObject:(ObjectType nonnull)anObject 

So verändert es bedeutet, dass Sie nicht ein Null-Objekt (nil) an diese Methode übergeben kann. Die gleiche Weise, in Ihrem Fall

+ (instancetype nonnull) array 

Methode wird nie nil zurückzukehren.

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

9

nonnull ist ein Schlüsselwort, das dem Compiler sagt, 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.

Sie können mehr darüber auf lernen the official Swift blog

+6

Sie meinen "wird nie * absichtlich * nil sein". –

+1

Es kann sein, nil, aber dann ist Ihre App in DS sowieso, und jenseits der Hoffnung. Ich frage mich, ob jemand versucht hat, was passiert, wenn Sie einer Swift-Objektreferenz Null zuweisen. – gnasher729

+2

@ gnasher729 - Basierend auf den Fragen, die ich hier sehe, versuchen Leute das ziemlich oft. –

0

nullable und ungleich NULL wurde eingeführt Objective C und Swift Interoperabilität zu erleichtern.

Ziel C macht keinen Unterschied zwischen optionalen und nicht optionalen Referenzen. Dann kann der Swift-Compiler nicht sicher sein, ob ein bestimmter Verweis auf Objective C-Code optional ist oder nicht.

NULL-Annotation ist die gleiche wie optional in Swift. nonnull-Annotation ist in Swift das gleiche wie nicht-optional.

Die Daumenregel ist jeder einfacher Zeigertyp (für weitere Informationen lesen the official Swift blog)

ich auch, dass diese neue Annotation Codequalität verbessern wird auch von Objective C Sicht sagen würde seine ungleich null angenommen wird. Ich frage mich normalerweise, ob die App abstürzen würde, wenn ein pass nil als Parameter? Zum Beispiel:

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

Compiler sagt nichts in diesem Fall und Ihre Anwendung in der Ausführungszeit zum Absturz! Jetzt mit dieser neuen Anmerkung werden Sie eine Warnung in der Kompilierungszeit sehen. Ich weiß, dass dieses Beispiel dumm ist, aber es gibt einige Fälle, in denen Sie nicht wissen, ob Sie überprüfen müssen, ob eine Eigenschaft null ist oder nicht, bevor Sie eine Methode aufrufen, es sei denn, Sie lesen die Dokumentation.

+1

In Ihrem Beispiel ist es wichtig zu beachten, dass die Anwendung nur abstürzt, weil die Ausnahme von NSMutableArray ausgelöst wurde. Die Tatsache, dass das Objektargument mit "nonnull" versehen ist, führt nicht zum Absturz der App mit einer Ausnahme (leider). Ich neige dazu, meine Eingaben für nil noch innerhalb meiner öffentlichen Methoden zu validieren und meine eigenen beschreibenden Ausnahmen zu werfen, anstatt sie später aus Gründen, die schwerer zu diagnostizieren sind, zu stürzen. –

3

nonnull ist ein Schlüsselwort, das dem Compiler mitteilt, dass der von Objekt/Parametern zurückgegebene Wert niemals ist.

Im Allgemeinen Sie bei nullable und ungleich NULL etwa so aussehen sollte Sie derzeit Behauptungen oder Ausnahmen verwenden: den Vertrag Fehler ein Programmierer ist zu verletzen. Insbesondere Rückgabewerte sind etwas, das Sie steuern, also sollten Sie nie null für einen nicht nullbaren Rückgabetyp zurückgeben, es sei denn, es ist aus Gründen der Abwärtskompatibilität.