我一直在反复讨论这个问题。在现实生活中,我看到代表特定品质的数字组,但我很难将它们表达为Swift中的独特类型。
例如百分比类型。我想我想要一个只有整数的Percent类型。此百分比也永远不会超过100或低于零。
我可以在纯C中表达为一个联合,成员的范围从0到100.然而,对于具有基础值类型的使用Swift枚举,我似乎并不喜欢纠正方法。或者是吗?
让我们选择另一个。 Bribor银行间利率。我知道它总是介于0到20%之间。但数字本身将是一个带小数点后两位的小数。
在Swift中处理这个问题的正确方法是什么?也许泛型?
答案 0 :(得分:1)
迈克尔在评论中说,可能是这样的:
struct IntPercent {
let value : Int8
init?(_ v : Int) {
guard v >= 0 && v <= 100 else { return nil }
value = Int8(v)
}
}
(注意:使用结构,而不是像这样的基类的类)
如果你做了很多,你可以使用协议改进一点,如下:
protocol RestrictedValue {
associatedtype T : Comparable
static var range : ( T, T ) { get }
var value : T { set get }
init() // hack to make it work
}
extension RestrictedValue {
init?(v: T) {
self.init()
guard Self.range.0 <= v && Self.range.1 >= v else { return nil }
value = v
}
}
struct IntPercent : RestrictedValue {
static var range = ( 0, 100 )
var value : Int = 0
init() {}
}
我认为你不能使用泛型来限制基类型值。
但我敢打赌,有一个更好的解决方案 - 这个绝对不是令人敬畏的: - )
答案 1 :(得分:0)
约束对象的值与约束类型不同。限制数字的数值并不是真的有意义,因为你所谈论的事情只是数字 - 没有百分数或Bribor-Interbank-Interest-rate数字这样的东西;他们只是数字。如果您想限制它们的价值,您可以在任何地方使用或使用数字。仅仅为了约束现有类型的值来定义新类型是没有意义的。