Hier ist eine Abhilfe, die ich gefunden: Erstellen Sie ein neues 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
}
}
Und dann kann man es wie so verwenden:
let dict: [HashableOptional<Int>: Int] = [nil: 1]
Sind Sie sicher, dass Sie das wollen? Definitionsgemäß gibt eine Taste 'nil' an * no value * an und der Typ kann nicht in 'NSDictionary' überbrückt werden, da der Typ Foundation nur nicht optionale Typen als Schlüsselwert ** und ** unterstützt. – vadian
@vadian Ja, ich brauche keine Vogelbeobachtung nach 'NSDictionary'. Hier ist mein Anwendungsfall: Ich baue eine Klassenhierarchie der Klassen in der Ziel-C-Laufzeit. Mit diesem Diktat werden Klassen einem Array ihrer Unterklassen zugeordnet. Wurzelklassen haben eine "nil" Superklasse, wie sie von 'class_getSuperclass' gegeben wird. – Alexander
@vadian Es könnte zu 'NSDictionary' überbrückt werden, da' nil' zu 'NSNull' überbrückt wird. – Hamish