首页 > 解决方案 > Swift 4.2 字典无法按键找到值

问题描述

我生成键以通过某些功能为字典选择值。当我比较生成的键和字典中的键的哈希值时,它们是相同的。但是如果我尝试通过生成的键从字典中获取一些东西——我得到了 nil。

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 并且算法更慢。有什么问题?

标签: swift

解决方案


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

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}

推荐阅读