迁移到Swift 2之后,我遇到了一个错误,说明我现在应该使用@convention(c)(T) - >我曾尝试过排列,但到目前为止还没有运气。
func foo(context: AnyObject?, width: CGFloat) -> Int {
}
let bar = unsafeBitCast(foo, CFunctionPointer<(UnsafeMutablePointer<Void>, Float) -> Int>.self)
答案 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调用约定。