The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

linuxでSwiftのObjCBool.boolValueを呼ぶとerror

不具合

SwiftでObjCBoolのboolValueをこのように呼び出すと

var isDir: ObjCBool = false
let isExist = fm.fileExists(atPath: directory, isDirectory: &isDir)
XCTAssertTrue(isDir.boolValue)

osxだと大丈夫だけどlinux環境だとerrorになる・・

error: value of type 'ObjCBool' (aka 'Bool') has no member 'boolValue'
        XCTAssertTrue(isDir.boolValue)
                      ^~~~~ ~~~~~~~~~

原因

no memberなわけないだろと思ったら、ほんとにno memberだった・・・

ObjCBool: Add boolValue property by spevans · Pull Request #1223 · apple/swift-corelibs-foundation · GitHub

対策

4.1で治ってるので

#if !os(Linux) || swift(>=4.1)
  XCTAssertTrue(isDir.boolValue)
#else   
  XCTAssertTrue(isDir)
#endif

もしくは

たくさんの場所でboolValueを使っている場合はextensionで4.1未満の場合にboolValueを時前で実装してしまう

#if os(Linux) || !swift(>=4.1)
extension ObjCBool {    
    var boolValue: Bool { return Bool(self) }   
}   
#endif