Swift 2中的新@convention(c):我该如何使用它?

时间:2015-06-09 18:58:26

标签: swift swift2

迁移到Swift 2之后,我遇到了一个错误,说明我现在应该使用@convention(c)(T) - >我曾尝试过排列,但到目前为止还没有运气。

func foo(context: AnyObject?, width: CGFloat) -> Int {

}

let bar = unsafeBitCast(foo, CFunctionPointer<(UnsafeMutablePointer<Void>, Float) -> Int>.self)

2 个答案:

答案 0 :(得分:23)

使用函数指针将Swift闭包传递给C函数 Swift 2现在支持参数,正如您所注意到的那样,函数 使用@convention(c)属性指定类型。

如果直接将闭包作为参数传递给C函数,那么 此属性是自动推断的。

举个简单的例子,如果你有这个C函数

CGFloat myCFunction(CGFloat (callback)(CGFloat x, CGFloat y)) {
    return callback(1.1, 2.2);
}

然后你可以从Swift中调用它

let result = myCFunction( {
    (x, y) -> CGFloat in
    return x + y
} )
print(result) // 3.3

与更详细的

完全相同
let swiftCallback : @convention(c) (CGFloat, CGFloat) -> CGFloat = {
    (x, y) -> CGFloat in
    return x + y
} 

let result = myCFunction( swiftCallback )
print(result) // 3.3

答案 1 :(得分:19)

您不再需要在Swift 2中创建CFunctionPointer。相反,您可以通过调用约定来注释您的类型,在本例中为typealias CFunction = @convention(c) (UnsafeMutablePointer<Void>, Float) -> Int let bar = unsafeBitCast(foo, CFunction.self) ,并直接使用它。

@convention

The Swift Programming Language的“类型属性”部分中{{1}}说明的相关位是:

  

c参数用于表示C函数引用。函数值不带上下文,并使用C调用约定。