从具体types“模糊引用会员地图”
这是我的代码。 它使用核心蓝牙的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
并通过调用适当的NSData
NSString
构造函数来获取字典的string表示forms。
我已经把字典转换成特定的types。 为什么我会在这里得到“成员地图”的模糊引用 ?
错误消息是误导。 真正的问题是,应用到字典的map()
方法不会返回一个新的字典,而是一个数组,在你的情况下[(String, String)]
,请参阅例如什么是最清洁的方式应用map()在Swift中? 讨论这个话题。
另一个问题是, NSString
不会隐式转换为String
,即NSString(data: data, ...)
应该被String(data: data, ...)
replace。
使用扩展方法
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) ?? "") }) }
或者,将返回types更改为[(String, String)]
:
func convert(v: AnyObject) -> [(String, String)] { return (v as! [CBUUID: NSData]).map { (uuid, data) in (uuid.UUIDString, String(data: data, encoding: NSUTF8StringEncoding) ?? "") } }