Xcode8.3とともに到来したSwift3.1。早速既存のProjectをSwift3.1でビルドできるように書き換えていたら、
次のような書き方がビルドエラーになっているのに気がつきました…。
ある関数をObjective-Cからは参照できて、Swiftでは使えなくする書き方
@available(*, unavailable)
と @objc
を使って、ある関数をObjective-Cからは参照できて、Swiftでは使えなくするような書き方をしていました。
// swift3.0.2まで
final class SampleClass: NSObject {
func doSomething(_ flag: Bool?) {
}
// 引数がBool?だとObjective-C側から呼び出せないので、ヘルパー関数を定義する
@available(*, unavailable)
@objc func doSomethingWithFlag(_ flag: Bool) {
doSomething(flag)
}
}
基本的にSwiftで実装を進めていく時に、struct
だったり、Bool?
みたいにプリミティブな型のOptionalだったりでObjective-Cから参照がうまくできない場合に、
Objective-Cからだけ呼び出せるヘルパー関数を用意していました。
これにより、
- Objective-Cからヘルパー関数を用いて処理を実行できる
- Objective-C用に用意したヘルパー関数をSwift側で間違って呼び出したりしないで済む
を満たせていました。
Swift3.1から怒られるようになった
だめだよ!! って言われてしまったので、 @available(*, unavailable)
を取ることにしました。
Objective-C用に用意したヘルパー関数をSwift側で間違って呼び出したりしないで済む
を満たせなくなったことで、Objective-C用に用意していた関数がSwiftでも呼び出せてしまうのは仕方ないのですが、一旦はこれで進もうと思います。
早くSwift onlyにしていきたい…。
参考
- [ObjCとSwiftでの相互利用マクロ・属性まとめ / Swiftで実装しつつObjCでしか使えないようにする] (http://qiita.com/fmtonakai/items/861883d1f36b67c873f6#swift%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A4%E3%81%A4objc%E3%81%A7%E3%81%97%E3%81%8B%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)