は
あなたはは、しかしenum
ラッパーを実装することができ(...あなたはCustomStringConvertible
への適合を見ている必要がありますが、技術的な議論のために、ここでは以下の)ここで各ケースラップ関連付けられた値の異なるタイプ(Optional<Int>
は.none
または.some(Int)
とほぼ同じです)。これにより
enum WindDirection {
case asDegree(Float)
case asString(String)
}
、あなたのインスタンス変数windDirection
はあなたがセッターに1つのラップタイプを期待してゲッター内の別のラッパー型を返すことができるようになる二つの異なるラップタイプのラッパーであるとすることができます。例:
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
}
}
私も、答えを見てみたいが、私は正直に答えははっきりと「いいえ」:-) – dasblinkenlight
答えではないことを願っています** **いいえ、あなたは実際に 'ValueTransformer'を必要としています – vadian