如何在Swift2中使用ObjC块typedef(特别是当包含BOOL参数时)

时间:2015-08-11 18:07:49

标签: objective-c swift objective-c-blocks typedef swift2

继续使用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)在传递/使用之前手动转换所有值:Boollet swiftSuccess = Bool(success)

2)停止对包含let objCFoo = ObjCBool(foo)参数

的块使用ObjC typedefs

有更好的方法吗?也许更改BOOL中的块签名以使用Swift和ObjC?但是怎么样?

1 个答案:

答案 0 :(得分:1)

酷! Apple在Xcode 7.0版(7A218)中修复此。现在将一个Swift Bool传递给一个带有BOOL参数的ObjC typedef的闭包就可以了。在Swift中将BOOL参数与truefalse进行比较也可以。

对我来说唯一的缺点是:现在我的所有解决方法代码行(例如completionBlock(ObjCBool(true)))都会导致编译器错误(有时甚至是稍微模糊的Segmentation fault: 11类型)。必须将它全部还原。叹息......(感谢上帝有git)