Voici une solution de contournement j'ai trouvé: Créer une nouvelle HashableOptional
enum
:
enum HashableOptional<Wrapped: Hashable> {
case none
case some(Wrapped)
public init(_ some: Wrapped) {
self = .some(some)
}
public init(_ optional: Wrapped?) {
self = optional.map{ .some($0) } ?? .none
}
public var value: Wrapped? {
switch self {
case .none: return nil
case .some(let wrapped): return wrapped
}
}
}
extension HashableOptional: Equatable {
static func ==(lhs: HashableOptional, rhs: HashableOptional) -> Bool {
switch (lhs, rhs) {
case (.none, .none): return true
case (.some(let a), .some(let b)): return a == b
default: return false
}
}
}
extension HashableOptional: Hashable {
var hashValue: Int {
switch self {
case .none: return 0
case .some(let wrapped): return wrapped.hashValue
}
}
}
extension HashableOptional: ExpressibleByNilLiteral {
public init(nilLiteral:()) {
self = .none
}
}
Et vous pouvez alors l'utiliser comme ceci:
let dict: [HashableOptional<Int>: Int] = [nil: 1]
Êtes-vous sûr de vouloir ça? Par définition, une clé 'nil' indique * no value * et le type ne peut pas être lié à' NSDictionary' car le type Foundation ne prend en charge que les types non optionnels comme clé ** et ** value. – vadian
@vadian Oui, je n'ai pas besoin de birding pour 'NSDictionary'. Voici mon cas d'utilisation: Je construis une hiérarchie de classe des classes dans le runtime de l'objectif C. Cette dict va mapper les classes à un tableau de leurs sous-classes. Les classes racines ont une superclasse "nil", donnée par 'class_getSuperclass'. – Alexander
@vadian Il pourrait être relié à 'NSDictionary', car' nil' sera relié à 'NSNull'. – Hamish