14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

The Swift Programming Language - Subscripts(サブスクリプティング)をまとめる

Last updated at Posted at 2014-06-10

The Swift Programming Language をまとめるトップ

Subscripts(サブスクリプティング)

クラス、構造体、列挙型にサブスクリプトを定義することができる
サブスクリプトはコレクション(配列、連想配列など)の要素にアクセスするための簡易的な方法
データの操作するメソッド等を別途つくらないで、簡単にデーターの操作ができる

一つの型に複数のサブスクリプトを定義することができる
適切なサブスクリプトが都度適切に選択されて作動する
複数のパラメータをサブスクリプトに定義することができる

Subscript Syntax(シンタックス)

インスタンスの名前に続けて記述できる
インスタンスメソッドと算出プロパティの記述に類似
メソッドの定義と同じ様にサブスクリプトのキーワードと複数のパラメータによって構成
read-write と read-only も定義可能で、算出プロパティの設定と同じ

基本形

subscript(index: Int) -> Int {
	get {
	// return サブスクリプトの戻り値
	}
	set(newValue) {
	// ここで設定操作をする
	}
}

newValueの型

サブスクリプトの戻り値の型と同じ
算出プロパティと同様に newValue を記述しなくて問題ない

読み取り専用サブスクリプト

set と get を省く

subscript(index: Int) -> Int {
	// return サブスクリプトの戻り値
}

読み取り専用の例

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
println("6 * 3 = \(threeTimesTable[6])")
// prints "6 * 3 = 18"

初期化するときに、multiplier に 3 をセットして、 threeTimesTable インスタンスを呼ぶ時に get でその multiplier に index 6 を掛けて 18 を返している

Subscript Usage(利用方法)

いまいち理解できていないどなたかに補足してもらいたい

サブスクリプトはコンテクストによって使われ方が様々ある
一般的には配列や連想配列やリストやセクエンスの操作の簡略手法として用いられる
クラスや構造体の機能として利用する事が多い

連想配列型のインスタンスを作成する
そして、その値を取得するためにサブスクリプトが作動する
サブスクリプト内で連想配列の操作ができる

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

上記、key-value のペーアでリテラルで連想配列を numberOfLegs として初期化
numberOfLegs は Dictionary として型が推論される
そして、 "bird" の文字列キーで整数値 2 がサブスクリプによって設定される

詳細はAccessing and Modifying a Dictionary(ディクショナリ・連想配列操作、更新) まで

NOTE
key に対して必ず値があるとは限らないので、 key-value のサブスクリプトは Int(Optional int)を返す

Subscript Options

複数の引数を受ける事ができる
後、あらゆる型を返す事ができる
値の処理系なので in-out引数(参照渡し)はつかえない

クラスと構造体で必要なだけサブスクリプトの定義ができる
サブスクリプトが呼ばれたときに、{} に含まれる値の型がによって適切なサブスクリプトがよばれる
これを subscript overloading サブスクリプトのオーバーロディングという

一番一般的な利用は、引数を一つだけ受けるサブスクリプトになるが、複数の引数を受ける事も必要に応じて可能
以下の Matrix 構造体の例をみてみる

struct Matrix {
    let rows: Int, columns: Int
    var grid: Double[]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(count: rows * columns, repeatedValue: 0.0)
    }
    func indexIsValidForRow(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

Matrix は初期化する時に 2 つのパラメータを受ける rows と columns
rows * columns を保持するための Double を生成

それぞれのポジションのは 0.0 という初期値を定義する
以下の様に定義してみる

var matrix = Matrix(rows: 2, columns: 2)

あとひとまずSubscript Options参照

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?