19

nullableXcode 6.3 以降、Objective-C の型はまたはnonnullでマークできます。これに関する Apple のブログ投稿はこちらです。

問題は、どちらも指定されていない場合、コンパイラが Objective-C コードを Swift に暗黙的にアンラップNSView!されたものとしてインポートすることです。そのため、オブジェクトが実際nil の場合、Swift からアクセスするとクラッシュします。これにより、コンパイラ エラーは発生しません。

これは失敗する可能性が非常に高いため、 、または audited region macrosを介して指定された場合を除き、デフォルトで Objective-C のすべてを としてコンパイラに想定させたいと思いnullableます。それはどのように達成できますか?nonnullNS_ASSUME_NONNULL_BEGIN / END

4

3 に答える 3

0

暗黙的にラップ解除されたオプショナルを取り除くために、nullability アノテーションを追加する方法はないようです。

ビルド フェーズとして追加することもできるすべての注釈なしのヘッダーを検索するスクリプトを作成したので、ヘッダーが見落とされることはありません。

于 2016-12-17T22:42:17.667 に答える
0

探しているものとは正確には異なりますが、Xcode 7 以降では、コンパイラ フラグにフラグCLANG_WARN_NULLABLE_TO_NONNULL_CONVERSIONを渡すことで、LLVM コンパイラ設定で有効にすることができます。これは、変換から変換-Wnullable-to-nonnull-conversionへの暗黙の変換がある場合に警告します。nullablenon-nullable

于 2016-10-28T00:22:22.023 に答える
-2

マクロは次のように定義されているため:

#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")

assume_nullable対応するマクロがあるかどうかを確認してみる価値があるかもしれません。

#define XX_ASSUME_NULLABLE_BEGIN _Pragma("clang assume_nullable begin")
#define XX_ASSUME_NULLABLE_END   _Pragma("clang assume_nullable end")

このプラグマがコンパイルに失敗するかどうかを確認するための簡単なテストのみを行いましたが、失敗しませんでした。しかし、これが Swift で期待される結果をもたらすかどうかはテストしていません。

于 2015-08-14T17:53:06.653 に答える