web-dev-qa-db-ja.com

Swift演算子 `添え字` []

私はSwiftの初心者で、演算子に関する予備知識がありません。

私は次のクラスを持っています

class Container {
   var list: [Any] = [];
}

listからデータにアクセスするために、演算子subscript []を実装したいと思います。

私はこのようなものが必要です:

var data: Container = Container()
var value = data[5]
// also    
data[5] = 5

また、私はこのようなものを書くことができるようにしたいと思います:

data[1][2]

Containerの要素1arrayであると考えることは可能ですか?

助けてくれてありがとう。

20
Colateral

ここには2つの質問があるようです。

1.自分のカスタムクラスでsubscriptingを有効にするにはどうすればよいですか?

クラスsubscriptingContainerを有効にするには、次のようにsubscript計算プロパティを実装する必要があります。

class Container {
    private var list : [Any] = [] // I made this private

    subscript(index:Int) -> Any {
        get {
            return list[index]
        }
        set(newElm) {
            list.insert(newElm, atIndex: index)
        }
    }
}

これで、このように使用できます。

var container = Container()
container[0] = "Star Trek"
container[1] = "Star Trek TNG"
container[2] = "Star Trek DS9"
container[3] = "Star Trek VOY"

container[1] // "Star Trek TNG"

2. data[1][2]のような何かを書く添え字をサポートするContainerの1つの要素にアクセスできますか?

いいえの例を使用する場合、できません。 data[1]はタイプAnyの何かを返すからです。また、Anyに添え字を付けることはできません。

しかし、キャストを追加すると可能になります

var container = Container()
container[0] = ["Enterprise", "Defiant", "Voyager"]
(container[0] as! [String])[2] // > "Voyager"
33
Luca Angeletti

回避策は、subscriptの複数のパラメーターを活用することです。

したがって、data[1][2]の代わりに、data[1, 2]と言うことができます。これは場合によっては便利です

struct Container {
  subscript(a: Int, b: Int) -> String {
    print(a)
    print(b)
    return "possible"
  }
}

let data = Container()
data[1, 2]
5
onmyway133

下付き文字を探しているようです。次の例のように、独自のタイプの添え字を作成できます。

class Container {
    var list = [["Hello", "World"], ["Foo", "Bar"]]

    subscript(index: Int) -> [String] {
        get {
            return list[index]
        }
        set {
            list.insert(newValue, atIndex: index)
        }
    }
}

上記の例は、Arrayを返すことがわかっているため、double [ ]で機能します。ここで、Arrayには例として文字列が含まれていますが、もちろん独自のタイプに交換することもできます

var container = Container()

container[0][0] = "Stack"
container[0][1] = "Overflow"

print(container[0][0]) // "Stack"
print(container[1][1]) // "Bar"
1
MortenHC
class Container
{
    var list: [AnyObject] = ["hello" , "world"];
    subscript ( i : Int) -> AnyObject{
        get{
            return list[i]
        }
        set{
            list[i] = newValue
        }
    }
}

var c : Container = Container()
println(c[1])

c[1] = "lol"

println(c[1])

オペレーターの詳細については: http://nshipster.com/Swift-operators/