Xcode 10 beta 1(Swift 4.2)でNimbleのthrowAssertion()
/raiseException()
マッチャーなどを使うとランタイムクラッシュする事象が発生して、その成り行きが面白かったのでここに記します。
ここまで
- 現象: Objective-Cで定義するメソッドで、引数のクロージャに
__attribute__((noescape))
(Swiftでは@escaping
を付けていないデフォルトの状態)を付けて、実際に渡すクロージャもエスケープされていないのにThread 1: closure argument passed as @noescape to Objective-C has escaped
というエラーでクラッシュしてしまう - 発見時の様子: https://github.com/Quick/Nimble/pull/530#issuecomment-394887303
- ちょうどWWDC 2018のSwift Open Hours labに質問に行けたので確認したところ、コンパイラーのバグ(リグレッション)に遭遇した模様
- バグチケット: rdar://40857699
- ワークアラウンドのPR: https://github.com/Quick/Nimble/pull/537
- Objective-Cサイドで
__attribute__((noescape))
を付けるのを諦める
- Objective-Cサイドで
ここから
- コンパイラーのバグが修正された模様
- https://github.com/apple/swift/pull/17067
- https://github.com/apple/swift/pull/17071
- Objective-Cの実装で
@try
/@catch
と組み合わさっていたところに問題があった模様
- おそらく本日リリースされたXcode 10 beta 2に修正が入っているのではないか
問題なかったらワークアラウンドのPRはrevertできるのでめでたい(期待)😇。
追記
Xcode 10 beta 2には該当の修正はまだ含まれていませんでした……残念。beta 3に期待。