如何在Swift中定义约束类型?

时间:2016-04-19 22:54:31

标签: swift

我一直在反复讨论这个问题。在现实生活中,我看到代表特定品质的数字组,但我很难将它们表达为Swift中的独特类型。

例如百分比类型。我想我想要一个只有整数的Percent类型。此百分比也永远不会超过100或低于零。

我可以在纯C中表达为一个联合,成员的范围从0到100.然而,对于具有基础值类型的使用Swift枚举,我似乎并不喜欢纠正方法。或者是吗?

让我们选择另一个。 Bribor银行间利率。我知道它总是介于0到20%之间。但数字本身将是一个带小数点后两位的小数。

在Swift中处理这个问题的正确方法是什么?也许泛型?

2 个答案:

答案 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数字这样的东西;他们只是数字。如果您想限制它们的价值,您可以在任何地方使用或使用数字。仅仅为了约束现有类型的值来定义新类型是没有意义的。