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