kitoko552.memo

kitoko552のメモ

Objective-CからSwiftのstruct(構造体)は使えない

要点

  • Objective-Cで使えるオブジェクトは全てNSObjectを継承しているため、NSObjectを継承できないSwiftのstruct(構造体)は使えない。
  • クラスも同様、NSObjectを継承していないクラスはObjective-Cからは使えない。

まだObjective-C書いてるの?

そう思う方もいるかもしれませんが、Objective-C時代から存在していた大きなアプリでは、未だにObjective-CとSwiftを併用しているアプリは結構あります。
ぼくが所属しているブロジェクトでもObjective-CとSwiftを併用していて、あるときSwiftのstructをObjective-Cから使おうとしたら、コンパイラにそんなオブジェクトねーよと怒られました。

Objective-Cのオブジェクトは全てNSObject

よく考えるとわかるのですが、Objective-Cのオブジェクトは全てNSObjectです。
Swiftでもクラスを定義する際にNSObjectを継承することはできますが、当然ながらstructはクラスじゃないのでNSObjectを継承できません。
なのでObjective-CからSwiftのstructは使えないのです。

struct Hoge {
  let num: Int
  let str: String
}
Hoge *hoge = [[Hoge alloc] init... // できない

Swiftで書いたクラスも同様

じゃあSwiftで書いたクラスならなんでも使えるかと言ったらそうではありません。
何度も言いますが、NSObjectを継承していないオブジェクトはObjective-Cでは使えないので、Swiftで書いたクラスでもNSObjectを継承していないとObjective-Cからは使えません。
これを忘れていると、なんでこのクラス使えないんだ!とハマることもしばしばあるので気をつけましょう。

おわり