Ich versuche, einen Currency
Typen zu definieren, die von numerischen und alphabetischen Währungscodes Verwechslungen verhindern würden:Dekodierung Generika mit Phantomtypen
public protocol ISO4217Type {}
public enum ISO4217Alpha: ISO4217Type {}
public enum ISO4217Num: ISO4217Type {}
public struct Currency<T: ISO4217Type> {
public let value: String
}
extension Currency where T == ISO4217Alpha {
public init?(value: String) {
let isLetter = CharacterSet.letters.contains
guard value.unicodeScalars.all(isLetter) else { return nil }
self.value = value
}
}
extension Currency where T == ISO4217Num {
public init?(value: String) {
let isDigit = CharacterSet.decimalDigits.contains
guard value.unicodeScalars.all(isDigit) else { return nil }
self.value = value
}
}
Dies funktioniert gut. Ist es jetzt möglich, eine Codable
Konformität hinzuzufügen, die einen Dekodierungsfehler auslösen würde, wenn versucht wird, einen Währungscode mit der falschen Nutzlast zu dekodieren? (Zum Beispiel Decodierung USD
als numerischer Währungscode.)