(您应该看一下与 的一致性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
    }
}