这是我的代码。它使用来自 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
调用 CBUUID.UUIDString
并通过调用适当的 NSString
构造函数来获取字典的字符串表示NSData
.
我已将字典转换为特定类型。为什么我会在此处看到“对成员‘ map ’的不明确引用”?
最佳答案
错误信息具有误导性。真正的问题是 map()
应用于字典的方法不会返回新字典,而是返回一个数组,在您的例子中是 [(String, String)]
,
参见示例 What's the cleanest way of applying map() to a dictionary in Swift?讨论该主题。
还有一个问题是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)]
:
func convert(v: AnyObject) -> [(String, String)] {
return (v as! [CBUUID: NSData]).map { (uuid, data) in
(uuid.UUIDString, String(data: data, encoding: NSUTF8StringEncoding) ?? "")
}
}
关于ios - "Ambiguous reference to member map"来自具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849414/