Betrachten Sie die folgende Methode
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Mit den Schlüsselwörtern new nonnull
und nullable
annotation können wir sie wie folgt anreichern:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
aber wir bekommen auch diese Warnung:
Dem Zeiger fehlt ein Nullfähigkeitstyp-Bezeichner (__nonnull oder __nullable).
Es bezieht sich auf den dritten Parameter (den Block 1).
Die Dokumentation enthält keine Beispiele für die Angabe der Nullbarkeit von Blockparametern. Es heißt wörtlich
Sie können die nicht unterstrichenen Formulare unmittelbar nach einer offenen Klammer nullbar und nicht null verwenden, sofern der Typ ein einfaches Objekt oder ein Blockzeiger ist.
Ich habe versucht, eines der beiden Schlüsselwörter für den Block (an einer beliebigen Position) ohne Glück zu platzieren. Habe auch die mit Unterstrich versehenen Varianten ( __nonnull
und __nullable
) ausprobiert .
Daher lautet meine Frage: Wie kann ich die Nullfähigkeitssemantik für Blockparameter angeben?
quelle
NSError **
Typ? Ich kann den Compiler nicht glücklich machen.The particular type NSError ** is so often used to return errors via method parameters that it is always assumed to be a nullable pointer to a nullable NSError reference.
developer.apple.com/swift/blog/?id=25Laut Apple Blog ("Nullability and Objective-C") können Sie verwenden
NS_ASSUME_NONNULL_BEGIN
undNS_ASSUME_NONNULL_END
.Innerhalb dieser Regionen wird jeder einfache Zeigertyp angenommen
nonnull
. Dann können Sie einfachnullable
für nullbare Objekte hinzufügen , die mögenNSError **
Typ, sollteNSError * _Nullable * _Nullable
id *
Typ istid _Nullable * _Nonnull
, hängt es besser davon ab (möglicherweise möchten Sie einen_Nullable id * _Nullable
Typ).NSObject *
Typ ist, müssen Sie wie folgt eine Anmerkung nach dem Zeiger setzenNSObject * _Nullable * _Nonnull
Hinweis
_Nonnull
und_Nullable
sollte nach Zeiger oderid
(Apple im BeispielcodeAAPLListItem * _Nullable
) verwendet werden, aber die nicht unterstrichenen Formennonnull
undnullable
können nach einer offenen Klammer verwendet werden.Weitere Informationen finden Sie unter "Nullability and Objective-C".
Das
_Nullable id * _Nonnull
kann verwirrt werden,id _Nullable * _Nonnull
ist besser zu verstehen._Nonnull
und_Nullable
sollte nach Zeiger oder verwendet werdenid
(Apple tut dies im BeispielcodeAAPLListItem * _Nullable
)quelle
Sie können auch Folgendes tun:
Es kommt nur darauf an, welche Syntax Ihnen besser gefällt.
quelle
Um Vervollständigungen in einer Header-Datei zu definieren, habe ich dies getan
Natürlich stimme ich der akzeptierten Antwort zu.
quelle
Aus dem Apple- Entwicklerblog : The Core: _Nullable und _Nonnull
quelle
Folgendes habe ich für den Fall NSError ** verwendet:
quelle
NSError **
müssen Sie die Nullbarkeit nicht angeben.