web-dev-qa-db-ja.com

Swift 2:の新しい@convention(c)2:どうすれば使用できますか?

Swift 2に移行した後、@ convention(c)(T)-> Uを使用する必要があることを示すエラーでこの問題が発生しています。幸運。

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

}

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

Swift 2でCFunctionPointerを作成する必要はなくなりました。代わりに、呼び出し規約(この場合はc)で型に注釈を付けて、直接使用できます。

typealias CFunction = @convention(c) (UnsafeMutablePointer<Void>, Float) -> Int
let bar = unsafeBitCast(foo, CFunction.self)

Swiftプログラミング言語 のタイプ属性セクションの@convention記述の関連ビットは次のとおりです。

C引数は、C関数参照を示すために使用されます。関数値はコンテキストを持たず、C呼び出し規約を使用します。

19
Mick MacCallum

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
25
Martin R