说,我有一个 C 函数:

const unsigned char *get_text(int idx);

在我的 Swift 代码中,我调用了这个 C 函数:
let idx: CInt = 6
let txt = get_text(idx)

然后将txt放入NSMutableDictionary:
var myDict = NSMutableDictionary()
//ERROR: Cannot invoke ‘setValue’ with an argument list of type ’UnsafePointer<UInt8>, forKey: String?)’
myDict.setValue(txt, forKey: “MyText”)

但是我得到上面的编译器错误。那我该如何设置字典的值呢?

最佳答案

C类型const unsigned char *被映射为SwiftUnsafePointer<UInt8>。您可以创建(可选)Swift字符串
从那个指针

let str = String.fromCString(UnsafePointer(txt))
myDict.setValue(str, forKey: "MyText")

假设从get_text()返回的C字符串是
UTF-8编码且NUL终止。
UnsafePointer()转换是必需的,因为fromCString()采用UnsafePointer<CChar>参数。
如果将C函数更改为
const char *get_text(int idx);

然后简化为
let str = String.fromCString(txt)

备注:在NSMutableDictionary中设置值的正确方法

setObject(_, forKey: _)

键值编码方法
setValue(_, forKey: _)

在大多数情况下具有相同的效果。例如看
Where's the difference between setObject:forKey: and setValue:forKey: in NSMutableDictionary?
了解更多信息。

您也可以考虑使用Swift Dictionary代替。

关于ios - 将C类型值设置为NSMutableDictionary,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32478915/

10-14 20:40