the que programming language español descargar apple swift swift2

programming - swift que es



Nuevo @convention(c) en Swift 2: ¿Cómo puedo usarlo? (2)

Pasar un cierre Swift a una función C que toma un parámetro de puntero de función ahora se admite en Swift 2 y, como notó, los tipos de función se especifican con el @convention(c) .

Si pasa un cierre directamente como un argumento a la función C, este atributo se deducirá automáticamente.

Como un simple ejemplo, si tienes esta función C

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

entonces puedes llamarlo desde Swift como

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

que hace exactamente lo mismo que el más detallado

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

Después de migrar a Swift 2, recibo este problema con un error que indica que ahora debería usar @convention (c) (T) -> U. He intentado permutaciones pero hasta ahora no he tenido suerte.

func foo(context: AnyObject?, width: CGFloat) -> Int { } let bar = unsafeBitCast(foo, CFunctionPointer<(UnsafeMutablePointer<Void>, Float) -> Int>.self)


Ya no necesita crear un CFunctionPointer en Swift 2. En su lugar, puede anotar su tipo llamando a la convención, en este caso c , y usarlo directamente.

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

Los bits relevantes de la descripción de @convention en la sección Atributos de tipo de The Swift Programming Language son:

El argumento c se utiliza para indicar una referencia a la función C. El valor de la función no tiene contexto y utiliza la convención de llamada C