1. ホーム
  2. swift

[解決済み] switch 文の外側で Swift の enum に関連付けられた値にアクセスする方法

2023-07-31 23:50:03

質問

考えてみましょう。

enum Line {
    case    Horizontal(CGFloat)
    case    Vertical(CGFloat)
}

let leftEdge             =  Line.Horizontal(0.0)
let leftMaskRightEdge    =  Line.Horizontal(0.05)

どうすればアクセスできるかというと、例えば lefEdge の関連する値に、switch 文を使わずに直接アクセスするにはどうしたらよいでしょうか?

let noIdeaHowTo          = leftEdge.associatedValue + 0.5

これではコンパイルすらできない!

私は これらの 質問 を参照してください。しかし、どの回答もこの問題に対処していないようです。

noIdeaHowTo をコンパイルしない行は、本当はこの一行であるべきなのです。 associated value は任意の型であることができるので、ユーザー コードがどのように "generic" get または le enum 自体の associatedValue メソッドさえ書くことができるかさえ分かりません。

最終的にこうなりましたが、これはひどいもので、ケースを追加/修正するたびにコードを見直す必要があります...。

enum Line {
    case    Horizontal(CGFloat)
    case    Vertical(CGFloat)

    var associatedValue: CGFloat {
        get {
            switch self {
                case    .Horizontal(let value): return value
                case    .Vertical(let value): return value
            }
        }
    }
}

どなたかご指摘をお願いします。

どのように解決するのですか?

他の人が指摘しているように、これはSwift 2で一応可能になりました。

import CoreGraphics

enum Line {
    case    Horizontal(CGFloat)
    case    Vertical(CGFloat)
}

let min = Line.Horizontal(0.0)
let mid = Line.Horizontal(0.5)
let max = Line.Horizontal(1.0)

func doToLine(line: Line) -> CGFloat? {
    if case .Horizontal(let value) = line {
        return value
    }
    return .None
}

doToLine(min) // prints 0
doToLine(mid) // prints 0.5
doToLine(max) // prints 1