将 C 类型值设置为 NSMutableDictionary
Posted
技术标签:
【中文标题】将 C 类型值设置为 NSMutableDictionary【英文标题】:set a C type value to NSMutableDictionary 【发布时间】:2015-09-09 11:55:05 【问题描述】:说,我有一个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字符串吗?如果不是,您可以使用[NSString stringWithCString:<(const char *)> encoding:<(NSStringEncoding)>];
并存储 C 字符串的 NSString 版本。
【参考方案1】:
C 类型 const unsigned char *
映射到 Swift 为
UnsafePointer<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
。
【讨论】:
以上是关于将 C 类型值设置为 NSMutableDictionary的主要内容,如果未能解决你的问题,请参考以下文章