2017-05-06 65 views
0

從C API填寫的size_t我有斯威夫特 - 如何通過指針

void Fill(size_t * val){ 
    *val = 15; 
} 

一個C API我如何可以調用此方法從斯威夫特3和填充內部類變量var number?另外,它應該有什麼類型?

回答

2

如果打開在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

+0

只是一個小挑剔:由於Swift已經開源,根據平臺'size_t'可能有不同的類型。在Swift端使用它之前,檢查'size_t'的具體類型總是一個好主意。除此之外,很好的答案:) –

+0

@PedroCastilho:是的,但「跳轉到生成的接口」將始終顯示具體類型,如果您傳遞不兼容的變量(因爲Swift沒有隱式類型轉換),編譯器會抱怨。 –

+0

@PedroCastilho:更新答案以滿足您的關注,感謝您的反饋! –

1

首先,您需要在平臺上找到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) 
    } 
}