詳解Swift編程中下標的用法
訪問一個集合的元素成員,在類中的序列和列表,結(jié)構(gòu)和枚舉都可以使用下標。這些下標用于存儲和使用索引來檢索值。數(shù)組元素可使用如:someArray[index],在 Dictionary 實例及其后續(xù)成員元素的訪問也可以使用如:someDicitonary[key]。
對于單一類型,下標范圍可以從單一到多個聲明。我們可以用適當?shù)南聵酥剌d傳遞給下標索引值的類型。下標也可以根據(jù)輸入數(shù)據(jù)類型聲明范圍從單一維度到多維度。
下標聲明語法和用法
讓我們回顧一下計算屬性。下標也遵循計算屬性相同的語法。對于查詢類型的實例下標括在方括號內(nèi),接著是實例名稱。下標語法遵循結(jié)構(gòu)作為 “實例方法” 和 “計算屬性” 相同的語法?!皊ubscript” 關(guān)鍵字用來定義標,用戶可以指定一個或多個參數(shù),它們帶有返回類型。下標可以有讀寫或只讀屬性和實例存儲和檢索使用 “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")
當我們使用 playground 運行上面的程序,得到以下結(jié)果
The number is divisible by 11 times The number is divisible by 50 times The number is divisible by 33 times The number is divisible by 20 times The 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])
當我們使用 playground 運行上面的程序,得到以下結(jié)果
Sunday Monday Tuesday Wednesday
下標選項
下標采用單一到多元的輸入?yún)?shù),這些輸入?yún)?shù)也屬于任意數(shù)據(jù)類型。還可以使用變量,可變參數(shù)的參數(shù)。下標不能提供缺省參數(shù)值,或使用任何 in-out 參數(shù)。
定義多個標被稱為“下標重載'在一個類 或結(jié)構(gòu)體根據(jù)需要可以提供多個下標定義。這些多個標是基于被下標括號內(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])")
當我們使用 playground 運行上面的程序,得到以下結(jié)果
1.0 2.0 3.0 5.0
Swift 下標支持單參數(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)
矩陣值可通過傳遞行和列值到下標,通過逗號隔開,進行定義如下所示。
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,1] = 5.0
下標方法的定義
下標方法的定義語法與實例方法和計算屬性的語法類似。
下標方法使用subscript關(guān)鍵字來指示是一個下標方法。與實例方法一樣,下標方法定義中可以規(guī)定一個或多個輸入?yún)?shù),并帶有一個返回類型。與實例方法不同的是下標方法可以是可讀寫的或是只讀的。與計算屬性的定義一樣,下標方法通過使用getter和setter來傳達下標方法的行為。如果在下標方法的定義中g(shù)etter和setter都被指定,則定義了一個可讀寫的下標方法,如果下標方法的定義中不包含setter,則定義了一個只讀的下標方法,并且這時代表getter方法的關(guān)鍵字get也可以省略。下標方法定義的完整語法如下:
subscript(index:Int) ->Int {
get {
// return an appropriate subscript value here
}
set(newValue) {
// perform a suitable setting action here
}
}
該例定義了一個可讀寫的下標方法,newValue可以指定,也可以不指定,不指定時使用默認的參數(shù)名newValue。
如下例子展示了一個只讀下標方法的定義和使用。由于只讀下標方法只指定一個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”
下標方法的使用
你能為一個類型定義和實現(xiàn)多個下標方法,編譯器基于你傳送給下標方法的索引參數(shù)的類型來推斷和選擇適當?shù)南聵朔椒ā?br /> 與方法類似,下標方法可以包含任意數(shù)量的輸入?yún)?shù),且這些輸入?yún)?shù)的類型可以是任何類型,下標方法也能返回任何類型。下標方法也能使用可變參數(shù),但不能使用in-out參數(shù)也不能通過默認參數(shù)值。
如可以定義一個帶有多個輸入?yún)?shù)的表示多緯度的下標方法,下面的例子展示了如何為一個矩陣結(jié)構(gòu)定義一個帶兩個整數(shù)類型的下標方法以及如何使用,定義的下標方法用來索引矩陣中定義的兩緯度的元素。
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
相關(guān)文章
SpringBoot3.0集成Redis緩存的實現(xiàn)示例
緩存就是一個存儲器,常用 Redis作為緩存數(shù)據(jù)庫,本文主要介紹了SpringBoot3.0集成Redis緩存的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-03-03Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解
這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細講解了Swift中的基本數(shù)據(jù)類型和基本語法,例如常量和變量、注釋、分號、整數(shù)、數(shù)值類型轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下2015-01-01