LoginSignup
3
4

More than 5 years have passed since last update.

【Swift】Objective-CのプロパティをSwiftから扱うときの注意点

Posted at

Objective-Cの@propertyで定義されたプロパティをSwiftから扱うときに知識不足で少し失敗したので、調べてみました。

間違い等があれば、ご指摘ください :raised_hands:

失敗内容

  • SwiftからObjective-Cのプロパティ(nullability annotationなし)を使用
  • Swiftでimplicitly unwrapped optionalな型に変換されたプロパティをそのまま使用
  • implicitly unwrapped optionalに変換されたObjective-Cの値がnilってることが原因で実行時エラー

結論

  • nullability annotationを適切に使用してSwiftから呼ぶときにimplicitly unwrapped optionalを使わないようにする。
  • 上記が難しい場合はnullability annotationを指定していないプロパティをSwiftから使うときには、nilチェックをする。(ちょっと気持ち悪い)

nullability annotationを指定していないプロパティをSwiftから使う

nullability annotationとは?

nullability annotationとは、Objective-Cのプロパティにつけられるnullablenonnullといった属性になります。(詳しくはこちら

nullability annotationがついたプロパティをSwiftから見ると?

Objective-Cのコードにて適切にnullability annotationが使用されている場合にSwiftでそのプロパティを使用するとどのように扱われるのでしょうか?

なんとなく想像できるかと思いますが、

  • nullableはOptionalでwrapされた型
  • nonnullは非Optionalな型

としてSwiftで扱うことができます。

[Objective-C]

@property (nullable) id nullableProperty;
@property (nonnull) id nonNullProperty;

[Swift]

var nullableProperty: AnyObject?
var nonNullProperty: AnyObject

nullability annotationがついていないプロパティをSwiftから見ると?

次に、nullability annotationが使用されていないプロパティをSwiftから扱うときにはどうなるか見てみます。

[Objective-C]

@property id unannotatedProperty;

[Swift]

var unannotatedProperty: AnyObject!

nullability annotationが使用されていないと、!が付いています。これはimplicitly unwrapped optionalと言うものです。
implicitly unwrapped optionalの実体はOptionalですが、確実に値が入っているという前提で暗黙的にunwrapされて使用されます。

実体はOptionalなので、もしnilが入っていた場合は暗黙的なunwrapでエラーになります。

気をつけたい点

ここでObjective-Cから変換されたimplicitly unwrapped optionalのプロパティの扱いに注意が必要です。
implicitly unwrapped optionalなので値が入っているはずなのですが、場合によってはObjective-Cのコードにてnilが入っているということが起こりえます。

なので、通常のimplicitly unwrapped optionalよりも気をつけて扱わないと予期せぬ実行時エラーに遭遇する可能性があります。

結論(再掲)

もし、Objective-Cから呼んだプロパティがimplicitly unwrapped optionalになっていたら以下のように対応するのが良さそうです。

  • nullability annotationを適切に使用してSwiftから呼ぶときにimplicitly unwrapped optionalを使わないようにする。
  • 上記が難しい場合はnullability annotationを指定していないプロパティをSwiftから使うときには、nilチェックをする。(ちょっと気持ち悪い)

終わりに

結論にも書いた通り、Objective-C側で適切にnullability annotationを使うことでSwiftと連携したときに安全なコードが書けそうです。

参考

3
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4