Использование ключа словаря при падении другого словаря - PullRequest
0 голосов
/ 30 апреля 2018

Следующий код не работает с ошибкой на площадке XCode. Не могу понять причину почему. Это было опробовано в XCode 9.3.

Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения в строке if (value as! String) != (dictionary[key] as! String) {. Здесь ключ равен x, словарь [ключ] равен nil, тогда как в словаре есть ключ с x.

//: Playground - noun: a place where people can play

import UIKit

extension Dictionary {
    func isSubDictionary(of dictionary: [AnyHashable: Any]) -> Bool {
        var fail = false
        outerloop: for (key, value) in self {
            switch value {
            case is Int:
                if (value as! Int) != (dictionary[key] as! Int) {
                    fail = true
                    break outerloop
                }
            case is Double:
                if (value as! Double) != (dictionary[key] as! Double) {
                    fail = true
                    break outerloop
                }
            case is String:
                if (value as! String) != (dictionary[key] as! String) {
                    fail = true
                    break outerloop
                }
            default:
                break
            }
        }

        return !fail
    }
}

let v: [AnyHashable: Any] = ["x": "y"]
let u: [AnyHashable: Any] = ["x": "y", "z": "u"]

print("\(v.isSubDictionary(of: u))\n")

1 Ответ

0 голосов
/ 30 апреля 2018

Вы добавили isSubDictionary в качестве расширения словаря, поэтому тип self - Dictionary<Key, Value>, а не Dictionary<AnyHashable, Any>. Это означает, что ключи self и dictionary не совпадают.

Значение типа AnyHashable скрывает, но все еще знает, тип это перенос. Когда вы пишете:

dictionary[key]

key обернут в AnyHashable, но тип оборачивается Key. Поэтому, когда он используется в качестве ключа для dictionary, обернутый тип Key не соответствует обернутым типам в ключах этого второго словаря. Вы можете увидеть это с помощью:

print("\(dictionary.keys.contains(self.keys.first!))") // prints false

Если вы хотите, чтобы два словаря были одного типа, сделайте функцию:

func isSubDictionary(of dictionary: [Key: Any]) -> Bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...