Словарь Swift 4.2 не может найти значение по ключу - PullRequest
0 голосов
/ 08 октября 2018

Я генерирую ключи для выбора значений для словаря по какой-либо функции.Когда я сравниваю хеш-значения сгенерированных ключей и ключей из словаря, они идентичны.Но если я пытаюсь получить что-то из словаря по сгенерированным ключам - я получаю ноль.

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 по сетке и сравнивать каждыйзначение, но в этом случае мне не нужен словарь и алгоритм работает медленнее.Что может быть не так?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Похоже, что вы возвращаете массив словарей здесь:

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}
0 голосов
/ 08 октября 2018

Кажется, словарь использует '==' для сравнения ключей, а не просто хеш-значение.Я изменил func '==' для структуры ключа, и теперь все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...