ios - 将 C 类型值设置为 NSMutableDictionary

标签 ios objective-c swift

比如说,我有一个 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 *映射到 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: _)

Key-Value Coding方法

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/

相关文章:

android - 跨平台应用程序(Android、iOS、Symbian)

iphone - iOS 推送通知 - 当您单击应用程序图标而不是通知时如何获取通知数据

ios - 处理具有底部约束的键盘

ios - 自定义导航栏有一个分隔线

ios - 如何将 UILabel 放入 "inputAccessoryView"用于键盘?

c# - Monotouch UITableViewCell AddSubView

ios - Crashlytics vs Fabric vs Firebase 崩溃报告——我迷路了

ios - 无法以编程方式执行 segue

iphone - 旋转图层的图形上下文忽略任何变换

objective-c - Objective-C中的for循环