具体类型的“对成员地图的模糊引用”

时间:2015-11-21 22:36:00

标签: 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.UUIDString调用CBUUID并为NSString调用相应的NSData构造函数来获取字典的字符串表示。

我已将字典转换为特定类型。为什么我在这里“模糊地提及会员'地图'

1 个答案:

答案 0 :(得分:5)

错误消息具有误导性。真正的问题是map() 应用于字典的方法不会返回新字典,而是返回一个数组,在您的情况[(String, String)]中, 有关该主题的讨论,请参阅What's the cleanest way of applying map() to a dictionary in Swift?

另一个问题是NSString未转换为String 隐含地,即NSString(data: data, ...)应该替换为 String(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) ?? "") 
    }
}