我想实现数字 struct ,它应该由整型文字初始化.
喜欢:
let digit: Digit = 5
但SWIFT不应该允许这样做(或者,作为一种 Select ,应该提出例外):
let digit: Digit = 15
我写了这段代码,但看起来不太好:
struct Digit: ExpressibleByIntegerLiteral, Equatable, CustomStringConvertible {
typealias IntegerLiteralType = Int
var description: String {
String(value)
}
var value: IntegerLiteralType {
// Unfortunately, set throws can't be implemented, only get throws.
willSet(newValue) {
if 0...9 ~= value {
self.value = newValue
}
}
}
init(integerLiteral: IntegerLiteralType) {
if 0...9 ~= integerLiteral {
value = integerLiteral
} else {
// This is definitely not good and may cause side effects.
// But init for ExpressibleByIntegerLiteral can't be failable.
value = 0
}
}
init?(from char: Character?) {
guard let char,
let newValue = IntegerLiteralType(String(char)),
0...9 ~= newValue
else {
return nil
}
value = newValue
}
}
在SWIFT 5.8中,我如何克服这一点?我猜在下一个版本中可能会使用宏,但不幸的是,我的SWIFT版本仍然没有它们.
谢谢.