Передача Swift замыкания в функцию C принимает функцию указателя параметр теперь поддерживается в Swift 2, и, как вы заметили, функция типов задаются с помощью атрибута @convention(c)
.
Если вы передаете закрытие непосредственно в качестве аргумента функции C, то этот атрибут выводится автоматически.
В качестве простого примера, если у вас есть эта функция C
CGFloat myCFunction(CGFloat (callback)(CGFloat x, CGFloat y)) {
return callback(1.1, 2.2);
}
, то вы можете вызвать его из Swift в
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
Я думаю, что должно быть возможно полностью избежать небезопасногоBitCast. Можете ли вы предоставить дополнительную информацию? Как объявляется функция C, что передается как объект контекста, ...? –
Это также может быть полезно для передачи указателей объектов через обратные вызовы C: http://stackoverflow.com/questions/30786883/swift-2-unsafemutablepointervoid-to-object. –
'CGFloat' - это не то же самое, что' Float'. На 64-битных платформах _ (т. Е. Каждое устройство Apple за последние несколько лет) _ это «Double», а на 32-битных платформах это «Float». Тем не менее, в Objective-C 'CGFloat' является просто простой C' typedef', поэтому вы должны просто использовать 'CGFloat' здесь. –