ios - "Ambiguous reference to member map"来自具体类型

标签 ios swift

这是我的代码。它使用来自 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/

相关文章:

iphone - 如何在地址簿保存联系人前检查是否添加了组织名称?

ios - 如何在 SwiftUI 中创建两个大小相同的 "squares"占据整个屏幕宽度?

ios - 使用 Objective-C 将 JSON 反序列化为自定义对象

ios - managedObject 上的 setValuesForKeysWithDictionary 在 swift 中给出编译错误

swift - 在TableView Swift 4中显示Firebase数据

ios - 适用于 iOS 的 Facebook SDK 3.1 - 在 iOS6 上运行,但在 iOS 5.x 上崩溃

ios - 使用 Alamofire 解析 JSON 问题

ios - 我是 Storyboard中的 5 个 Controller ,如何以编程方式返回官方初始 Controller ?

ios - 对于 Swift 2.2 的循环更新抛出二元运算符错误

iphone - Swift 中的 Dropbox 集成