继续使用Xcode7(beta5)和Swift 2后,我的Swift代码中出现了关于传递的timestamp = moment(formatted,'DD/MM/YYYY H:m:s').utc().unix();
(或Bool
/ BOOL
)值的错误(或者使用Objective-C ObjCBool
。
typedef
当我在Swift类中使用此类型时,我遇到了编译器错误。
typedef void (^completion_success_block_t) (BOOL success);
为什么第(3)行编译得很好,但不是第(2)行?
在某些情况下,似乎编译器确实在func doSomething(completionBlock : completion_success_block_t) {
doSomethingElse { success in
if success == true { } // (1) error 1
let foo : Bool = true
completionBlock(foo) // (2) error 2
completionBlock(true) // (3) works just fine!
}
}
// error 1: "Binary operator '==' cannot be applied to operands of type 'ObjCBool' and 'Bool'"
// error 2: "Cannot invoke 'completionBlock' with an argument list of type '(Bool)'"
func doSomethingElse(completionBlock : completion_success_block_t) {
completionBlock(true)
}
和ObjCBool
之间进行转换,但并非总是如此。
感觉就像使用我的ObjC Bool
就像告诉编译器:'我真的希望这是typedef
,而不是ObjCBool
,所以请不要进行任何转换为了我'。但这不是我想要的。我的代码在Xcode 6中运行得很好。
现在我只看到两个选项:
1)在传递/使用之前手动转换所有值:Bool
和let swiftSuccess = Bool(success)
2)停止对包含let objCFoo = ObjCBool(foo)
参数
typedefs
有更好的方法吗?也许更改BOOL
中的块签名以使用Swift和ObjC?但是怎么样?
答案 0 :(得分:1)
酷! Apple在Xcode 7.0版(7A218)中修复此。现在将一个Swift Bool
传递给一个带有BOOL参数的ObjC typedef的闭包就可以了。在Swift中将BOOL
参数与true
或false
进行比较也可以。
对我来说唯一的缺点是:现在我的所有解决方法代码行(例如completionBlock(ObjCBool(true))
)都会导致编译器错误(有时甚至是稍微模糊的Segmentation fault: 11
类型)。必须将它全部还原。叹息......(感谢上帝有git)