Swift study - Subscripts
Swift - Subscripts
クラス、構造体、および列挙型は、セット、リスト、または順序のメンバー要素にアクセスするためのショートカットキーとしてサブスクリプトを定義します.サブスクリプトを使用して、他のメソッドの設定や検索を必要とせずにインデックス検索と値の設定を行います.例えば、someArray[index]
を使用して配列内の要素にアクセスすることができ、ディック郡の例はsomeDictionary[key]
を使用することができる.
1つのタイプの複数のサブスクリプトを定義し、サブスクリプトに渡されるインデックス値のタイプに応じて適切なサブスクリプトを選択できます.サブスクリプトは1つの階層に限定されず、設定したタイプのニーズを満たすために複数のパラメータを定義できます.
Subscript Syntax(サブスクリプト構文)
サブスクリプトは、インスタンス名の後ろのカッコに1つ以上の値を作成することで、タイプのインスタンスを検索します.この構文は、インスタンスメソッド構文と計算されたProperty構文に似ています.subscript
キーワードを使用してサブスクリプトを定義し、インスタンスメソッドに従って1つ以上の入力パラメータと戻りタイプを指定できます.インスタンスメソッドとは異なり、サブスクリプトは読み取り専用または読み取り専用です.この動作は来賓と来賓によって伝達され、計算のプログラムと同じ方法である.subscript(index: Int) -> Int {
get {
// Return an appropriate subscript value here.
}
set(newValue) {
// Perform a suitable setting action here.
}
}
newValue
のタイプは、サブスクリプトの戻り値と同じです.計算されたプログラムと同様に、パラメータを指定することなく選択できます.基本パラメータはnewValue
と呼ばれ、直接提供されなければセイトに提供される.
読み取り専用計算プロパティと同様に、get
キーワードを削除することで、読み取り専用propertyを簡単に宣言できます.subscript(index: Int) -> Int {
// Return an appropriate subscript value here.
}
// 읽기-전용 서브스크립트 구현
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"
上記の例では、サブスクリプト(threeTimesTable[6]
)を呼び出すことによって、threeTimesTable
インスタンスを検索することができる.これはthree-times-table
の6番目の項目を要求します.
NOTE
以上の排水表は固定的な数学規則に従っている.新しい値を設定するのに適していないため、上記のサブスクリプトは読み取り専用プログラムとして定義されています.
Subscript Usage(サブスクリプトを使用)
サブスクリプトの正確な意味は、使用するコンテキストの場所によって異なります.サブスクリプトは、通常、コレクション、リスト、およびシーケンスメンバー要素にアクセスするショートカットキーとして使用されます.サブスクリプトは、特定のクラスまたは構造体の機能に最も適した方法で自由に実現できます.
たとえば、swiftのdickshernerタイプは、dickshernerインスタンスに格納されている値を検索および設定するためにサブスクリプトを実装します.サブスクリプトの角カッコにdicksherryキータイプのキーを指定し、サブスクリプトにdicksherry値タイプの値を割り当てることで値を設定できます.var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
上のディックシャナリタイプは[String: Int]
と推定される.
NOTE
swiftのdickshernerタイプは、戻りタイプとサブスクリプトを運ぶキー値サブスクリプトを実行します.上記の例では、キー値サブスクリプトは、ディクシャナの場合、Int? or optional int
タイプの値を有するか、または返す.ディックシャナタイプは、外部サブスクリプトタイプを使用して、すべての鍵が値を持たない事実をモデリングし、これらの鍵にnil
を割り当てることによって削除方法を提供する.
速博適用オプション(サブスクリプトオプション)
サブスクリプトは、複数の入力パラメータを受信できますが、これらの入力パラメータは任意のタイプです.また、サブスクリプトは任意のタイプの値を返します.
関数のように、サブスクリプトには異なる数のパラメータがあり、そのパラメータのデフォルト値を指定できます.関数とは異なり、サブスクリプトでは入出力パラメータは使用できません.
必要に応じて、クラスまたは構造体は、複数のサブスクリプトの実装を提供し、使用する適切なサブスクリプトは、値のタイプまたはサブスクリプトカッコに含まれる値に基づいて導出されます.この複数のサブスクリプトは、サブスクリプトオーバーロードとして定義されます(subscript overloading
).
1つのパラメータを持つサブスクリプトが最も一般的ですが、複数のパラメータを含むサブスクリプトを適切なタイプに定義することもできます.サンプル構造には、次の2つの整数パラメータがあります.struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
上の行列は、頭文字Liserを提供し、2つのタイプのrows * columns
値を格納するのに十分な配列を生成する.配列の各位置には、0.0が初期値として与えられます.これを得るために、配列の寸法、初期値は、その寸法を初期化し、作成する新しい配列の頭文字Riserに渡されます.// 적당한 열과 행 값을 주어 매트릭스 인스턴스를 만들 수 있다.
var matrix = Matrix(rows: 2, columns: 2)
このマトリクスインスタンスのグリッド配列は、2 D配列が左上右下から読み込まれたときに有効なスムーズ(1 D)配列です.
元の2 Dタイル
// 값을 설정하는 모습
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
マトリクス構文のゲストとゲストには、サブスクリプトのカラムとローの値が有効かどうかを検証するためのブレークスルーが含まれています.これを助けるために、行列は、列と行が行列の境界内にあるかどうかを調べるindexIsValid(row:column:)
と呼ばれる便利な方法を含む.func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
let someValue = matrix[2, 2]
// 어설션이 발생한다. 범위 밖이기 때문.
タイプSubscripts(タイプサブスクリプト)
前述したように、インスタンスサブスクリプトは、特定のタイプのインスタンスから呼び出されるサブスクリプトです.タイプ内で自分で呼び出すサブスクリプトを定義できます.これらのサブスクリプトをタイプサブスクリプトと呼びます.タイプのサブスクリプトを表すために、サブスクリプトキーワードの前にstatic
キーワードを記述することができる.クラスはclass
のキーワードで置き換えることができ、サブスクリプトの親の実装をサブクラスで上書き(再定義)することもできます.次の例です.enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
static subscript(n: Int) -> Planet {
return Planet(rawValue: n)!
}
}
let mars = Planet[4]
print(mars)
// mars 출력
Reference
この問題について(Swift study - Subscripts), 我々は、より多くの情報をここで見つけました
https://velog.io/@rbw/Swift-study-Subscripts
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
subscript(index: Int) -> Int {
get {
// Return an appropriate subscript value here.
}
set(newValue) {
// Perform a suitable setting action here.
}
}
subscript(index: Int) -> Int {
// Return an appropriate subscript value here.
}
// 읽기-전용 서브스크립트 구현
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
// 적당한 열과 행 값을 주어 매트릭스 인스턴스를 만들 수 있다.
var matrix = Matrix(rows: 2, columns: 2)
// 값을 설정하는 모습
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
let someValue = matrix[2, 2]
// 어설션이 발생한다. 범위 밖이기 때문.
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
static subscript(n: Int) -> Planet {
return Planet(rawValue: n)!
}
}
let mars = Planet[4]
print(mars)
// mars 출력
Reference
この問題について(Swift study - Subscripts), 我々は、より多くの情報をここで見つけました https://velog.io/@rbw/Swift-study-Subscriptsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol