Passando una chiusura Swift a una funzione C prendendo un parametro funzione pointer è ora supportata in Swift 2, e, come notato, funzione vengono specificati con l'attributo @convention(c)
.
Se si passa una chiusura direttamente come argomento alla funzione C, allora questo attributo viene dedotto automaticamente da .
Come semplice esempio, se si dispone di questa funzione C
CGFloat myCFunction(CGFloat (callback)(CGFloat x, CGFloat y)) {
return callback(1.1, 2.2);
}
allora si può chiamare da Swift come
let result = myCFunction({
(x, y) -> CGFloat in
return x + y
})
print(result) // 3.3
che fa esattamente lo stesso del più prolisso
let swiftCallback : @convention(c) (CGFloat, CGFloat) -> CGFloat = {
(x, y) -> CGFloat in
return x + y
}
let result = myCFunction(swiftCallback)
print(result) // 3.3
fonte
2015-06-10 03:06:23
Penso che dovrebbe essere possibile evitare completamente il non sicuro BitCast. Potete fornire ulteriori informazioni? Come viene dichiarata la funzione C, cosa viene passato come oggetto contesto, ...? –
Ciò può anche essere utile per passare i puntatori agli oggetti tramite callback C: http://stackoverflow.com/questions/30786883/swift-2-unsafemutablepointervoid-to-object. –
'CGFloat' non è uguale a' Float'. Sulle piattaforme a 64 bit _ (vale a dire ogni dispositivo Apple negli ultimi anni) _ è un 'Double' e su piattaforme a 32 bit è un' Float'. Comunque, in Objective-C 'CGFloat' è solo un semplice' C 'typedef', quindi dovresti semplicemente usare' CGFloat' qui. –