( への適合性を参照する必要がありますCustomStringConvertible
が、技術的な議論のために、ここに続きます ...)
ただし、各ケースが異なるタイプの関連付けられた値をラップするラッパーを実装することはできます (ラップやenum
によく似ています)。Optional<Int>
.none
.some(Int)
enum WindDirection {
case asDegree(Float)
case asString(String)
}
これにより、インスタンス変数windDirection
を 2 つの異なるラップされた型のラッパーにすることができます。これにより、セッターで 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
}
}