Swift 4.2字典无法通过键找到值

时间:2018-10-08 13:09:13

标签: swift

我生成用于通过某些功能为字典选择值的键。 当我比较生成的键的哈希值和字典中的键时,它们是相同的。但是,如果我尝试通过生成的键从字典中获取某些信息,我将为零。

let vCoords = verticesFrom(axes: result)
print ("Generated:")
vCoords.forEach { 
    print($0, $0.hashValue)
}
print ("Stored:")
grid.forEach {
    print($0.key, $0.key.hashValue, $0.value.data)
}

let data1 = vCoords.map { grid[$0]?.data }.compactMap{$0}

print ("\nData: \(data1)")

列表为:

Generated:
["x": -100.0, "y": -100.0] 8549935799981594856
["x": -100.0, "y": -50.0] -5857979117386601619
["x": -10.0, "y": -100.0] 5216433118710295311
["x": -10.0, "y": -50.0] 3277190687522282455
Stored:
["x": -100.0, "y": -100.0] 8549935799981594856 [NSCalibratedRGBColorSpace 1 1 1 1]
["x": -100.0, "y": -50.0] -5857979117386601619 [NSCalibratedRGBColorSpace 0.583333 0.583333 0.583333 0.666667]
["x": -10.0, "y": -100.0] 5216433118710295311 [NSCalibratedRGBColorSpace 0.685 0.685 0.685 1]
["x": -10.0, "y": -50.0] 3277190687522282455 [NSCalibratedRGBColorSpace 0 0 1 1]

Data: []

当然,我可以通过网格vCoords进行迭代并比较每个值,但是在这种情况下,我不需要Dictionary且算法较慢。怎么了?

2 个答案:

答案 0 :(得分:2)

似乎您在这里返回了一个字典数组:

let vCoords = verticesFrom(axes: result)

具体类似(但不是字典,因为它已经符合Equatable了)

[[String: Int]]    
[["x": -100.0, "y": -100.0], ["x": -100.0, "y": -50.0].... ]

这里是您需要更改的内容,以便您获得预期的结果:

如果尚未为您的

创建自定义对象

verticesFrom(axes: result)

您应该创建一个自定义类并使其符合Equatable协议:

class CustomCoordinate: Equatable {    
    var customX: Int
    var customY: Int

// ...
   public static func == (lhs: CustomCoordinate, rhs: CustomCoordinate) -> Bool {
        return lhs.customX == rhs.customX && lhs.customY == rhs.customY
    }
}

否则,如果这意味着项目中有太多更改,则需要快速修复:

let data1 = vCoords.map ({ vectCoord -> [String: Int]? in // [String: Int]? or whatever objet you are using
    grid.first(where: { (customCoord) -> Bool in
        return customCoord["x"] == vectCoord["x"] && customCoord["y"] == vectCoord["y"]
    })
}).compactMap{$0}

答案 1 :(得分:0)

似乎Dictionary使用'=='来比较键,而不仅仅是哈希值。我将func'=='更改为键结构,现在可以了。