訪問一個集合的元素成員,在類中的序列和列表,結(jié)構(gòu)和枚舉都可以使用下標(biāo)。這些下標(biāo)用于存儲和使用索引來檢索值。數(shù)組元素可使用如:someArray[index],在 Dictionary 實例及其后續(xù)成員元素的訪問也可以使用如:someDicitonary[key]。
對于單一類型,下標(biāo)范圍可以從單一到多個聲明。我們可以用適當(dāng)?shù)南聵?biāo)重載傳遞給下標(biāo)索引值的類型。下標(biāo)也可以根據(jù)輸入數(shù)據(jù)類型聲明范圍從單一維度到多維度。
下標(biāo)聲明語法和用法
讓我們回顧一下計算屬性。下標(biāo)也遵循計算屬性相同的語法。對于查詢類型的實例下標(biāo)括在方括號內(nèi),接著是實例名稱。下標(biāo)語法遵循結(jié)構(gòu)作為 “實例方法” 和 “計算屬性” 相同的語法。“subscript” 關(guān)鍵字用來定義標(biāo),用戶可以指定一個或多個參數(shù),它們帶有返回類型。下標(biāo)可以有讀寫或只讀屬性和實例存儲和檢索使用 “getter” 和 “setter” 屬性作為計算屬性。
語法
subscript(index:Int)->Int{get{// used for subscript value declarations}set(newValue){// definitions are written here}}
示例1
struct subexample {let decrementer:Int
subscript(index:Int)->Int{return decrementer / index
}}let division = subexample(decrementer:100)
println("The number is divisible by /(division[9]) times")
println("The number is divisible by /(division[2]) times")
println("The number is divisible by /(division[3]) times")
println("The number is divisible by /(division[5]) times")
println("The number is divisible by /(division[7]) times")
當(dāng)我們使用 playground 運行上面的程序,得到以下結(jié)果
The number is divisible by 11 timesThe number is divisible by 50 timesThe number is divisible by 33 timesThe number is divisible by 20 timesThe number is divisible by 14 times
示例2
class daysofaweek {privatevar days =["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","saturday"]
subscript(index:Int)->String{get{return days[index]}set(newValue){self.days[index]= newValue
}}}var p = daysofaweek()
println(p[0])
println(p[1])
println(p[2])
println(p[3])
當(dāng)我們使用 playground 運行上面的程序,得到以下結(jié)果
SundayMondayTuesdayWednesday
下標(biāo)選項
下標(biāo)采用單一到多元的輸入?yún)?shù),這些輸入?yún)?shù)也屬于任意數(shù)據(jù)類型。還可以使用變量,可變參數(shù)的參數(shù)。下標(biāo)不能提供缺省參數(shù)值,或使用任何 in-out 參數(shù)。
定義多個標(biāo)被稱為“下標(biāo)重載'在一個類 或結(jié)構(gòu)體根據(jù)需要可以提供多個下標(biāo)定義。這些多個標(biāo)是基于被下標(biāo)括號內(nèi)聲明值的類型推斷。
structMatrix{let rows:Int, columns:Intvarprint:[Double]
init(rows:Int, columns:Int){self.rows = rows
self.columns = columns
print=Array(count: rows * columns, repeatedValue:0.0)}
subscript(row:Int, column:Int)->Double{get{returnprint[(row * columns)+ column]}set{print[(row * columns)+ column]= newValue
}}}var mat =Matrix(rows:3, columns:3)
mat[0,0]=1.0
mat[0,1]=2.0
mat[1,0]=3.0
mat[1,1]=5.0
println("/(mat[0,0])")
println("/(mat[0,1])")
println("/(mat[1,0])")
println("/(mat[1,1])")
當(dāng)我們使用 playground 運行上面的程序,得到以下結(jié)果
1.02.03.05.0
Swift 下標(biāo)支持單參數(shù)到多參數(shù)聲明相應(yīng)數(shù)據(jù)類型。該程序聲明的“矩陣”結(jié)構(gòu)為2*2維數(shù)組矩陣來存儲 “Double” 數(shù)據(jù)類型。 矩陣參數(shù)被輸入整數(shù)數(shù)據(jù)類型用來聲明行和列。
矩陣新實例是通過使行和列數(shù)來初始化創(chuàng)建的,如下所示。
var mat = Matrix(rows: 3, columns: 3)
矩陣值可通過傳遞行和列值到下標(biāo),通過逗號隔開,進行定義如下所示。
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,1] = 5.0
下標(biāo)方法的定義
下標(biāo)方法的定義語法與實例方法和計算屬性的語法類似。
下標(biāo)方法使用subscript關(guān)鍵字來指示是一個下標(biāo)方法。與實例方法一樣,下標(biāo)方法定義中可以規(guī)定一個或多個輸入?yún)?shù),并帶有一個返回類型。與實例方法不同的是下標(biāo)方法可以是可讀寫的或是只讀的。與計算屬性的定義一樣,下標(biāo)方法通過使用getter和setter來傳達下標(biāo)方法的行為。如果在下標(biāo)方法的定義中g(shù)etter和setter都被指定,則定義了一個可讀寫的下標(biāo)方法,如果下標(biāo)方法的定義中不包含setter,則定義了一個只讀的下標(biāo)方法,并且這時代表getter方法的關(guān)鍵字get也可以省略。下標(biāo)方法定義的完整語法如下:
subscript(index:Int) ->Int {
get {
// return an appropriate subscript value here
}
set(newValue) {
// perform a suitable setting action here
}
}
該例定義了一個可讀寫的下標(biāo)方法,newValue可以指定,也可以不指定,不指定時使用默認的參數(shù)名newValue。
如下例子展示了一個只讀下標(biāo)方法的定義和使用。由于只讀下標(biāo)方法只指定一個getter,意義是明確的,因此可以省略get關(guān)鍵字。
struct TimesTable {
let multiplier:Int
subscript(index:Int) ->Int {
return multiplier *index
}
}
let threeTimesTable =TimesTable(multiplier:3)
println("six times three is/(threeTimesTable[6])")
// prints "six times three is 18”
下標(biāo)方法的使用
你能為一個類型定義和實現(xiàn)多個下標(biāo)方法,編譯器基于你傳送給下標(biāo)方法的索引參數(shù)的類型來推斷和選擇適當(dāng)?shù)南聵?biāo)方法。
與方法類似,下標(biāo)方法可以包含任意數(shù)量的輸入?yún)?shù),且這些輸入?yún)?shù)的類型可以是任何類型,下標(biāo)方法也能返回任何類型。下標(biāo)方法也能使用可變參數(shù),但不能使用in-out參數(shù)也不能通過默認參數(shù)值。
如可以定義一個帶有多個輸入?yún)?shù)的表示多緯度的下標(biāo)方法,下面的例子展示了如何為一個矩陣結(jié)構(gòu)定義一個帶兩個整數(shù)類型的下標(biāo)方法以及如何使用,定義的下標(biāo)方法用來索引矩陣中定義的兩緯度的元素。
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)
}
subscript(row:Int,column:Int) ->Double {
get {
return grid[(row *columns) +column]
}
set {
grid[(row *columns) +column] =newValue
}
}
}
var matrix =Matrix(rows:2,columns:2)
matrix[0,1] =1.5
matrix[1,0] =3.2