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

Еще один вопрос «тип выражения неоднозначен». Я не думаю, что кто-то поднимал эту конкретную ситуацию до сих пор...

Если я встрою класс в другой класс и сделаю его Hashable, кажется, я не смогу использовать его в качестве ключа:

class TestClassWithKey {
    class Key: Hashable {
        static func == (left: Key, right: Key) -> Bool {
            return false
        }
        var hashValue: Int {
            return 4
        }
    }
}
var myList = [TestClassWithKey.Key: TestClassWithKey]()
// Above line gives classic "type of expression is ambiguous"
// compiler error.

Очевидно смешной пример, но если я сделаю то же самое, но без вложенности, все будет отлично:

class TestClassWithoutKeyKey: Hashable {
    static func == (left: TestClassWithoutKeyKey, right: TestClassWithoutKeyKey) -> Bool {
        return false
    }
    var hashValue: Int {
        return 4
    }
}
class TestClassWithoutKey {
}
var myList = [TestClassWithoutKeyKey: TestClassWithoutKey]()

Я хотел бы знать, есть ли способ использовать вложенный тип в качестве ключа к словарю, или (в идеале), если нет, то почему бы и нет.

На Swift 3, но я не думаю, что это актуально...


person daphtdazz    schedule 06.12.2016    source источник
comment
Это та же проблема, что и Почему нельзя Я создаю пустой массив вложенного класса? — вы можете либо сказать var myList : [TestClassWithKey.Key : TestClassWithKey] = [:], либо сослаться на тип без синтаксического сахара, либо использовать typealias.   -  person Hamish    schedule 06.12.2016
comment
Черт возьми, спасибо, я виню изобилие типов контейнеров Swift в том, что не нашел его!   -  person daphtdazz    schedule 06.12.2016