这是我的代码。它使用来自Core Bluetooth的CBUUID
。我们假设v
的演员表是有效的。
import UIKit
import CoreBluetooth
func convert(v: AnyObject) -> [String: String] {
return (v as! [CBUUID: NSData]).map { (uuid, data) in
(uuid.UUIDString, NSString(data: data, encoding: NSUTF8StringEncoding) ?? "")
}
}
我们的想法是通过为CBUUID.UUIDString
调用CBUUID
并为NSString
调用相应的NSData
构造函数来获取字典的字符串表示。
我已将字典转换为特定类型。为什么我在这里“模糊地提及会员'地图'?
答案 0 :(得分:5)
错误消息具有误导性。真正的问题是map()
应用于字典的方法不会返回新字典,而是返回一个数组,在您的情况[(String, String)]
中,
有关该主题的讨论,请参阅What's the cleanest way of applying map() to a dictionary in Swift?。
另一个问题是NSString
未转换为String
隐含地,即NSString(data: data, ...)
应该替换为
String(data: data, ...)
。
使用扩展方法
extension Dictionary {
init(_ pairs: [Element]) {
self.init()
for (k, v) in pairs {
self[k] = v
}
}
}
从引用的线程中,您可以使用
返回一个新字典func convert(v: AnyObject) -> [String: String] {
let dict = v as! [CBUUID: NSData]
return Dictionary(dict.map { (uuid, data) in
(uuid.UUIDString, String(data: data, encoding: NSUTF8StringEncoding) ?? "")
})
}
或者,将返回类型更改为[(String, String)]
:
func convert(v: AnyObject) -> [(String, String)] {
return (v as! [CBUUID: NSData]).map { (uuid, data) in
(uuid.UUIDString, String(data: data, encoding: NSUTF8StringEncoding) ?? "")
}
}