1

float の範囲を文字列にマップしたい。詳細には、たとえば、基本的な方向を持つ対応する文字列で、風の方向を次のように変換したいと思います: 220 -> SW

対応Floatする? _ このように、 と書きますが、 と読みます。getStringFloatString

何かのようなもの:

var windDirection: Float? {
    get {
        switch self.windDirection {
        case 348.75..<11.25:
            return "N"
            break
        ...
        default:
            break
        }
    }
    set (newValue) {
        self.windDirection = newValue
    }
}

そうでない場合、同じ動作を生成するためにどのような可能性が必要ですか?

4

4 に答える 4

1

このように列挙型を使用できると思います

enum Wind {
    case degree(Float)
    case direction(String)
}

extension Wind {

    init?(degree: Float) {
        switch degree {
        case 11.25..<385:
            self = .direction("N")
        default:
            return nil
        }
    }

}

let wind = Wind(degree: 100) // Result is direction("N")
于 2016-12-12T13:33:04.980 に答える
0

( への適合性を参照する必要があります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
    }
}
于 2016-12-12T13:20:01.423 に答える