将 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:&lt;(const char *)&gt; encoding:&lt;(NSStringEncoding)&gt;]; 并存储 C 字符串的 NSString 版本。 【参考方案1】:

C 类型 const unsigned char * 映射到 Swift 为 UnsafePointer&lt;UInt8&gt;。你可以创建一个(可选的)Swift 字符串 从那个指针与

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

这假设从get_text() 返回的 C 字符串是 UTF-8 编码和 NUL 终止。

UnsafePointer() 转换是必要的,因为fromCString() 接受UnsafePointer&lt;CChar&gt; 参数。 如果将 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的主要内容,如果未能解决你的问题,请参考以下文章

C语言各个数据类型取值范围

将 NOW() 设置为日期时间数据类型的默认值?

Mysql将默认值设置为json类型列

将输入类型日期最小值设置为当前日期角度 12

memset用法总结

无法将空对象设置为 Record 类型的参数的默认值