2

以下を機能させようとしています:

enum Foobar {
    case values([Int])
    case singleThing(Double)

    subscript(index:Int) -> Int? {
        get {
            switch self {
            case .values (let numbers):
                return numbers[index]
            default:
                return nil
            }
        }
        set {
            switch self {
            case .values (let numbers):
                numbers[index] = newValue!
            default:
                break
            }
        }
    }
}

上記のコードはコンパイルされません。numbersを割り当てたときに更新しているという事実について不平を言いletます。で置き換えてみましletvar。コンパイルします。ただし、元の配列自体ではなく、関連付けられた配列の値のコピーを更新するため、何もしません。少なくとも私はそうなると思います。

添え字付け可能な値を関連付けてset、適切な場合にプロパティを実装できるようにするアプローチはありますか?

4

2 に答える 2

4

case .values (let numbers):
    numbers[index] = newValue!

numbers現在関連付けられている値にバインドされているローカル変数です。を使用してもvar numbers、列挙のインスタンスではなく、この変数のみを変更します。

case .values (var numbers):
    numbers[index] = newValue!
    self = .values(numbers)

あなたが期待することをするべきです。(ただし、添え字セッターを呼び出すと、nilプログラムがクラッシュすることに注意してください。)

于 2015-12-08T18:43:48.677 に答える
1

いくつかの問題が発生しています。

  • 列挙型の関連値を変更することはできません
  • あなたのケースステートメントで
    • number変更できない定数であると定義しています
    • number配列はコピーによって渡される構造体であるため、関連する値のコピーです

列挙型を変更できない値の型として扱うと、すべてが簡単になります。可変型が必要な場合は、代わりに構造体またはクラスを使用できます。

このように機能することが本当に必要な場合は、ケースを次のように変更することで機能させることができます。

case .values (var numbers):
    numbers[index] = newValue!
    self = .values(numbers)
于 2015-12-08T18:45:38.350 に答える