Đi qua một đóng Swift để một hàm C tham gia một chức năng tham số con trỏ hiện đang được hỗ trợ trong Swift 2, và, như bạn thấy, chức năng loại được chỉ định với các thuộc tính @convention(c)
.
Nếu bạn vượt qua một đóng cửa trực tiếp như một đối số cho hàm C thì thuộc tính này được suy ra tự động.
Là một ví dụ đơn giản, nếu bạn có chức năng C này
CGFloat myCFunction(CGFloat (callback)(CGFloat x, CGFloat y)) {
return callback(1.1, 2.2);
}
sau đó bạn có thể gọi nó từ Swift như
let result = myCFunction({
(x, y) -> CGFloat in
return x + y
})
print(result) // 3.3
mà thực hiện chính xác giống như các tiết hơn
let swiftCallback : @convention(c) (CGFloat, CGFloat) -> CGFloat = {
(x, y) -> CGFloat in
return x + y
}
let result = myCFunction(swiftCallback)
print(result) // 3.3
Nguồn
2015-06-10 03:06:23
Tôi nghĩ rằng có thể tránh được hoàn toàn không an toànBitCast. Bạn có thể cung cấp thêm một số thông tin? Hàm C được khai báo như thế nào, cái gì được truyền như đối tượng ngữ cảnh, ...? –
Điều này cũng có thể hữu ích khi truyền con trỏ đối tượng qua C callbacks: http://stackoverflow.com/questions/30786883/swift-2-unsafemutablepointervoid-to-object. –
'CGFloat' không giống với' Float'. Trên nền tảng 64 bit _ (nghĩa là mỗi thiết bị của Apple trong vài năm qua) _ đó là một nền tảng 'Double' và 32 bit, đó là một' Float'. Tuy nhiên, trong Objective-C 'CGFloat' chỉ là một chữ cái' C kiểu chữ ', vì vậy bạn chỉ nên sử dụng 'CGFloat' ở đây. –