13

nonnullC 関数では機能しますが、obj-c メソッドでは機能しません。明確にするために、私はこれを提案しています

- (void)doSomethingWithRequiredString:(NSString * __attribute((nonnil)))requiredString
                                  bar:(NSString *)optionalString);

または(非nullに似ています)

- (void)doSomethingWithRequiredString:(NSString *)requiredString
                                  bar:(NSString *)optionalString)
__attribute((nonnil(0)));

技術的に正当な理由があるのか​​どうか、私は頭を悩ませています。私は、clang がコンパイル時のチェックまたは静的解析のために属性を実際にしか使用できないことを理解していますが、それは直交しているようです。これを持っていない強い理由はありますか?

4

3 に答える 3

26

あなたは完全にできます。あなたが間違っている唯一のことは、メソッドパラメータが 0 インデックスであると考えていることnonnullですnonnil

- (void)doSomethingWithRequiredString:(NSString *)requiredString
                                  bar:(NSString *)optionalString
        __attribute((nonnull(1)));

今それを使おうとすると:

id thing = ...;
[thing doSomethingWithRequiredString:nil bar:@"42"];

Xcode は、「null 以外の引数を必要とする呼び出し先に Null が渡されました」という警告を表示します。

また、__attribute の "(1)" 部分を省略すると、非 nil 要件がすべてのパラメーターに適用されると見なされます。

Clang は GCC 属性を認識し、GCC の属性の定義は次のnonnullとおりです


更新: Xcode 6.3の時点で、よりクリーンな構文がサポートされています。

nullableプロパティとメソッドでは、キーワードはnonnullnull_unspecifiedです。

したがって、メソッドの署名は次のようになります。

- (void)doSomethingWithRequiredString:(nonnull NSString *)requiredString
                                  bar:(nullable NSString *)optionalString;
于 2013-10-04T16:29:17.000 に答える
0

はいあります。

次のようにコーディングできます。

- (nullable AAPLListItem *)itemWithName:(nonnull NSString *)name;
- (NSInteger)indexOfItem:(nonnull AAPLListItem *)item;

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

于 2015-05-06T02:50:32.903 に答える