Swift 2に移行した後、@ convention(c)(T)-> Uを使用する必要があることを示すエラーでこの問題が発生しています。幸運。
func foo(context: AnyObject?, width: CGFloat) -> Int {
}
let bar = unsafeBitCast(foo, CFunctionPointer<(UnsafeMutablePointer<Void>, Float) -> Int>.self)
Swift 2でCFunctionPointerを作成する必要はなくなりました。代わりに、呼び出し規約(この場合はc
)で型に注釈を付けて、直接使用できます。
typealias CFunction = @convention(c) (UnsafeMutablePointer<Void>, Float) -> Int
let bar = unsafeBitCast(foo, CFunction.self)
Swiftプログラミング言語 のタイプ属性セクションの@convention
記述の関連ビットは次のとおりです。
C引数は、C関数参照を示すために使用されます。関数値はコンテキストを持たず、C呼び出し規約を使用します。
Swiftクロージャを関数ポインタパラメータを取るC関数に渡すことが、Swift 2でサポートされ、お気づきのように、関数タイプは@convention(c)
属性。
C関数の引数としてクロージャを直接渡すと、この属性は自動的に推測されます。
簡単な例として、このC関数がある場合
CGFloat myCFunction(CGFloat (callback)(CGFloat x, CGFloat y)) {
return callback(1.1, 2.2);
}
次に、Swift asから呼び出すことができます
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