我在庫中有以下 C 風格的結構:
typedef struct ServiceParam
{
const char *name;
const char *value;
} ServiceParam;
我對從 Swift 初始化這些結構的陣列很感興趣,這是我嘗試過的:
let cHeaders = headers.map{ServiceParam(name: $0.name, value: $0.value)}
但是收到以下警告:
將 'String' 傳遞給引數,但引數 'value' 應該是一個指標,該指標比對 'init(name:value:)' 的呼叫壽命更長

的name和valueC-引數被鑄造在形式UnsafePointer<CChar>!和輸入型別是(name: String, value: String),即夫特元組,但我與關于改變初始型柔性。
因此,整個最小示例如下所示:
public func setParams(headers: [(name: String, value: String)] = []) {
let cHeaders = headers.map{FsKeyServiceParam(name: $0.name, value: $0.value)}
// Do the work with `cHeaders`
}
從 Swift 呼叫站點初始化上述 C 樣式結構的最佳方法是什么?
該ServiceParam結構僅在父函式呼叫期間臨時使用,但name和value字串作為 C 對存盤在陣列中,并且它們的生命周期在函式回傳后繼續:
稍后的:
const auto paramPair = std::make_pair(params->name, params->value);
instance_variable_array.push_back(paramPair);
uj5u.com熱心網友回復:
當將 Swift 字串傳遞給帶有const char *引數的 C 函式時,會自動創建一個臨時的 C 字串表示。但是,該 C 字串僅在函式呼叫期間有效。這就是發生在
FsKeyServiceParam(name: $0.name, value: $0.value)
并導致警告。有一種withCString方法可用于創建在某些范圍內有效的 C 字串表示形式:
name.withCString { cName in
value.withCString { cValue in
let sp = ServiceParam(name: cName, value: cValue)
// Do something with sp ...
}
}
但同樣,在執行離開這些范圍后,C 字串指標無效。
為了延長 C 字串的生命周期,您可以復制記憶體并稍后釋放它:
let cHeaders = headers.map{ ServiceParam(name: strdup($0.name),
value: strdup($0.value)) }
// Do the work with `cHeaders`
for header in cHeaders {
free(UnsafeMutablePointer(mutating: header.name))
free(UnsafeMutablePointer(mutating: header.value))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/381628.html
