Ios &引用;“对成员地图的引用不明确”;从混凝土类型
这是我的密码。它使用来自核心蓝牙的Ios &引用;“对成员地图的引用不明确”;从混凝土类型,ios,swift,Ios,Swift,这是我的密码。它使用来自核心蓝牙的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: NSUTF8St
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
调用CBUUID.UUIDString
,并为NSData
调用相应的NSString
构造函数来获取字典的字符串表示形式
我已将词典转换为特定类型。为什么我会在这里看到“对成员‘map’的模糊引用”?错误消息具有误导性。真正的问题是
map()
应用于字典的方法不会返回新字典,而是返回一个数组,在您的示例中是[(String,String)]
,
有关该主题的讨论,请参见示例
另一个问题是NSString
未转换为String
隐式地,即,NSString(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)]
:
谢谢我不想使用字典扩展名,我可以使用
(String,String)
。所以我只是尝试更改函数返回类型,但它仍然返回相同的错误。有什么指导吗?
func convert(v: AnyObject) -> [(String, String)] {
return (v as! [CBUUID: NSData]).map { (uuid, data) in
(uuid.UUIDString, String(data: data, encoding: NSUTF8StringEncoding) ?? "")
}
}