说,我有一个 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/