从具体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.UUIDStringCBUUID并通过调用适当的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) ?? "") } }