Swift3.1でとある書き方ができなくて困った

Thursday, March 30, 2017

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にしていきたい…。

参考

techSwift

iOS10で通知済みのローカル通知を削除する

ffmpegを使って動画から音声を削除する