問題タブ [objective-c-nullability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - Objective-C の Nullability: 定数文字列の修飾
NSNotification
私は、名前のようなものに定数文字列を宣言して使用するというかなり良い習慣を身につけました。私はそれらを次のように宣言します:
nonnull
Xcode 6.3 と Swift 1.2 の導入に伴い、新しい、nullable
、およびnull_unspecified
修飾子を使用して、Swift と相互運用する Objective-C クラスに戻って監査しています。
外部から見える静的文字列も含むヘッダーに修飾子を追加すると、次の警告が表示されます。
警告: ポインターに null 許容型指定子 (__nonnull または __nullable) がありません
うーん。それは紛らわしい/興味深いです。誰かがこのメッセージの背後にある理由を説明できますか? Swift で使用ABCAwesomeThingHappenedNotification
する場合、オプションの文字列または暗黙的にラップされていない文字列であることを示唆することはありません。
objective-c - コンパイラにデフォルトで「nullable」を想定させる方法
nullable
Xcode 6.3 以降、Objective-C の型はまたはnonnull
でマークできます。これに関する Apple のブログ投稿はこちらです。
問題は、どちらも指定されていない場合、コンパイラが Objective-C コードを Swift に暗黙的にアンラップNSView!
されたものとしてインポートすることです。そのため、オブジェクトが実際にnil の場合、Swift からアクセスするとクラッシュします。これにより、コンパイラ エラーは発生しません。
これは失敗する可能性が非常に高いため、 、または audited region macrosを介して指定された場合を除き、デフォルトで Objective-C のすべてを としてコンパイラに想定させたいと思いnullable
ます。それはどのように達成できますか?nonnull
NS_ASSUME_NONNULL_BEGIN / END
ios - PF_NULLABLE 解析フレームワークを理解するのが難しく、メッセージを PFUser に送信する
Xcode 6.3 パースを使用。フレームワークでエラーが発生していたので、更新された Parse フレームワークをダウンロードすると、動作が開始されました。
さて、この方法logInWithUsername
が何であるかを理解しようとしている新しいことがあります。以前はかなりシンプルでした。コードを書いている間、より多くの null が表示されます。そして、ある時点で、主にポインターへのポインター(つまりNSError
)で混乱します。
定義にジャンプすると、それはまったく別の話です。構文は次のように明確に見えます。
このフレームワークの構成またはセットアップ側で何か不足していますか?
swift - Null可能性が利用可能になる前のSwiftの Implicitly Unwrapped Optional の使用
nullability に関する Apple のブログでは、次のように言及されています。
「... Swift では、オプションの参照と非オプションの参照の間に強い区別があります。たとえば、NSView と NSView? のように、Objective-C はこれら 2 つのタイプの両方を NSView * として表します。Swift コンパイラは、特定の NSView * がオプションであるかどうかに関係なく、型は暗黙的にアンラップされたオプションの NSView として Swift に取り込まれます!"
これは、Objective-C メソッドが Swift で暗黙的にラップされていないオプションを返すと宣言したときに、実際にクラッシュする可能性があることを意味しますか (暗黙的にラップされていないオプションで宣言されたメソッドの一部が nil を返す可能性があるため)。それとも、Apple は絶対に nil を返さない Objective-C メソッドだけが、暗黙的にラップ解除されたオプションとして宣言されるようにしますか?
objective-c - Objective-Cのnullable、__nullable、_Nullableの違い
Xcode 6.3 では、 Objective-Cの API の意図をより適切に表現するために (そしてもちろん、より良い Swift サポートを確実にするために)新しい注釈が導入されました。これらの注釈は、もちろんnonnull
、nullable
およびnull_unspecified
.
しかし、Xcode 7 では、次のような多くの警告が表示されます。
ポインターに null 許容型指定子 (_Nonnull、_Nullable、または _Null_unspecified) がありません。
それに加えて、Apple は別のタイプの null 可能性指定子を使用して、C コードをマークします ( source )。
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
要約すると、これらの 3 つの異なる nullability アノテーションが用意されました。
nonnull
、nullable
、null_unspecified
_Nonnull
、_Nullable
、_Null_unspecified
__nonnull
、__nullable
、__null_unspecified
注釈を使用する理由と場所はわかっていますが、どのタイプの注釈を使用する必要があるか、どこで、なぜ使用する必要があるかについて少し混乱しています。これは私が集めることができるものです:
- プロパティには、、、を使用する必要が
nonnull
ありnullable
ますnull_unspecified
。 - メソッドのパラメーターには、、、を使用する必要が
nonnull
ありnullable
ますnull_unspecified
。 - C メソッドの場合、 , , を使用する必要が
__nonnull
あり__nullable
ます__null_unspecified
。 - ダブルポインターなどの他のケースでは、、、を使用する必要が
_Nonnull
あり_Nullable
ます_Null_unspecified
。
しかし、基本的に同じことを行うアノテーションがこれほど多くある理由については、いまだに混乱しています。
だから私の質問は:
これらの注釈の正確な違いは何ですか?それらを正しく配置する方法とその理由は?
objective-c - 互換性のない型 _Nonnull から _Nullable への代入を警告しますが、修飾子を変更しても何も起こりません
次のメソッドを定義するプロトコルがあります。
それを実装するクラスには次のプロパティがあります。
メソッドの実装は次のようになります。
これは正確な警告です:
互換性のない型 '__strong id _Nonnull' から 'id _Nullable' に割り当てています
nullability を変更しても何も起こりません。
編集: .m ファイルに次のクラス拡張子があります。