(您应该看一下与 的一致性CustomStringConvertible
,但对于技术讨论,以下是...)
但是,您可以实现一个enum
包装器,其中每个案例包装不同类型的关联值(很像Optional<Int>
wraps.none
或.some(Int)
)。
enum WindDirection {
case asDegree(Float)
case asString(String)
}
有了这个,您可以让您的实例变量windDirection
成为两种不同包装类型的包装器,这将允许您在 setter 中期望一种包装类型并在 getter 中返回另一种包装类型。例如:
class Foo {
private var _windDirection: WindDirection
var windDirection: WindDirection {
get {
switch _windDirection {
case .asDegree(let angle):
switch(angle) {
case 348.75..<360.0, 0..<11.25: return .asString("N")
case 11.25..<33.75: return .asString("NE")
/* ... */
case _ : return .asString("Not expected")
}
case _ : return .asString("Not expected")
}
}
set (newValue) {
if case .asDegree(_) = newValue {
_windDirection = newValue
}
}
}
init?(_ windDirection: WindDirection) {
guard case .asDegree(_) = windDirection else { return nil }
_windDirection = windDirection
}
}
示例用法(但是,您需要在调用实例属性时处理包装的关联值的展开)
// attempt initialization
if let foo = Foo(.asDegree(11.0)) {
// getter
if case .asString(let windDirection) = foo.windDirection {
print(windDirection) // N
}
// setter
foo.windDirection = .asDegree(15.75)
// getter
if case .asString(let windDirection) = foo.windDirection {
print(windDirection) // NE
}
}