從C API填寫的size_t我有斯威夫特 - 如何通過指針
void Fill(size_t * val){
*val = 15;
}
一個C API我如何可以調用此方法從斯威夫特3和填充內部類變量var number
?另外,它應該有什麼類型?
從C API填寫的size_t我有斯威夫特 - 如何通過指針
void Fill(size_t * val){
*val = 15;
}
一個C API我如何可以調用此方法從斯威夫特3和填充內部類變量var number
?另外,它應該有什麼類型?
如果打開在Xcode的C頭文件,並從Xcode的菜單中選擇「Navigate->跳轉到生成的接口」,那麼你會看到 功能導入到斯威夫特
public func Fill(_ val: UnsafeMutablePointer<Int>!)
你通過使用作爲&
INOUT表達一個初始化 變量的地址從夫特調用它,比較"Interacting with C APIs":
易變指針
當一個函數被聲明爲接受一個
UnsafeMutablePointer<Type>
參數,它可以接受任何以下的:
- ...
- 一種在出包含一個可變變量表達式,屬性或下標參考類型爲
Type
,它作爲指針傳遞給可變值的地址。- ...
你的情況:
var myval = 0 // Type is `Int`
Fill(&myval)
但斯威夫特定義size_t
以及
public typealias size_t = Int
因此你可以(甚至更好)定義變量
var myval: size_t = 0
然後它也可以在其他平臺上編譯,這些平臺可以以不同方式定義 size_t
。
首先,您需要在平臺上找到size_t
的實際基本類型。然後,你可以使用this table來找出你需要使用這個函數的類型。舉例來說,假設size_t
是#define
別名unsigned long
,這個功能的雨燕簽名會:
func Fill(_ val: UnsafeMutablePointer<CUnsignedLong>!)
由於Objective-C的是C嚴格的超集,你可以C文件添加到項目中the same way you would add Objective-C files:創建一個橋接頭並導入你想要在其中使用的功能。
一旦你創建了一個橋接頭並導入了相應的頭文件,你應該可以從Swift代碼中調用Fill
而沒有問題。你應該能夠使用它如下:
import Foundation
class SomeClass {
var number: CUnsignedLong = 0
func someMethod() {
Fill(&number)
}
}
只是一個小挑剔:由於Swift已經開源,根據平臺'size_t'可能有不同的類型。在Swift端使用它之前,檢查'size_t'的具體類型總是一個好主意。除此之外,很好的答案:) –
@PedroCastilho:是的,但「跳轉到生成的接口」將始終顯示具體類型,如果您傳遞不兼容的變量(因爲Swift沒有隱式類型轉換),編譯器會抱怨。 –
@PedroCastilho:更新答案以滿足您的關注,感謝您的反饋! –