実際、私はその話題を少し混乱させました。私は、ある程度大きなプロジェクトでは、NULL可能性の状況を改善したいと考えました(より迅速に)。ここに私が見つけたものがあります。
まず、あなたがCLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION
をオンにする必要があります(-Wnullable-to-nonnull-conversion
)
第二に、およそ
最初にローカルを使用して、そのオブジェクトは、属性指定されていないNULL可能、 のように、それはへの合法的なパラメータとして使用することができています非nullを予期するメソッド
これは悪臭を覚え、NONNUL_CAST()
というマクロを作成しました。ここではそれを実装する方法の例です:
ここ
#define NONNUL_CAST(__var) ({ NSCAssert(__var, @"Variable is nil");\
(__typeof(*(__var))* _Nonnull)__var; })
あなたがハック__typeof(*(__var))* _Nonnull)__var
を見ることができますが、それはそれほど悪くないです。 __var
のタイプがA* _Nullable
の場合は、__var
を逆参照しますので、今度はタイプをA
とし、再度参照してから_Nonnull
としてください。__var
は答えになります。もちろん、何かがうまくいかない場合に備えて、我々は主張する。
は第三に、あなたはすべてのローカル変数にnullabiltyを指定する必要があり、そしてあなたは、このように、NS_ASSUME_NONNULL_BEGIN/END
にすべてのコードを配置する必要があります
NS_ASSUME_NONNULL_BEGIN
<your_code_goes_here>
NS_ASSUME_NONNULL_END`
あなたが入れそこにあなたのコードの(輸入を除く)EVERY LINE、 .h
と.m
ファイルです。これは、メソッド、戻り値の型、およびプロパティのすべての引数がNULLでないことを前提としています。ヌル可能にしたい場合は、ヌル可能にしてください。
これですべて完了しました。ここ は、典型的な使い方の例である:
- (Atype*)makeAtypeWithBtype:(nullable BType*)btype {
Atype* _Nullable a = [btype makeAtype];
if (a) {
// All good here.
return NONNUL_CAST(a);
} else {
// a appeared as nil. Some fallback is needed.
[self reportError];
return [AtypeFactory makeDeafult];
}
}
は今、あなたは、より堅牢なNULL可能な状況があります。それはきれいに見えないかもしれませんが、それは客観的なものなので、不平を言うことはありません。
どのような問題を解決しようとしていますか?オブジェクトがゼロでないことを知ったときに警告を抑制する?またはオブジェクトがゼロでないことを確認する実際のプロセスですか? – dan
@dan次のようなコードがあるとします。NSMutableData * someData = [NSMutableData dataWithCapacity:d1000]; [someData appendData:[NSString stringWithFormat:@ "$%d"、1000000]]; '。 'appendData:'は非NULLを予期しているので、まずコールの前にNSString *を作成しておいてください。理想的には、私は問題を回避しようとしているコードの余分な行を追加して、まったく何のメリットも与えないので、これをやりたいとは思わない。 – KBancho
警告はもう存在しないという利点があります。追加コード行の価値があるかどうかは、あなた次第です。私はそれに問題は見られません。 – dan