在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 下標(biāo)
特性(Attributes)
Access Control 權(quán)限控制的黑與白
基本運(yùn)算符(Basic Operators)
基礎(chǔ)部分(The Basics)
閉包(Closures)
擴(kuò)展
泛型參數(shù)(Generic Parameters and Arguments)
訪問控制和 protected
語句(Statements)
模式(Patterns)
WWDC 里面的那個(gè)“大炮打氣球”
關(guān)于語言參考(About the Language Reference)
語法總結(jié)(Summary of the Grammar)
嵌套類型
類型(Types)
Swift 初見(A Swift Tour)
泛型
枚舉(Enumerations)
高級(jí)運(yùn)算符
繼承
析構(gòu)過程
關(guān)于 Swift(About Swift)
訪問控制
類和結(jié)構(gòu)體
內(nèi)存安全
Swift 與 C 語言指針友好合作
協(xié)議
屬性(Properties)
可選類型完美解決占位問題
錯(cuò)誤處理
字符串和字符(Strings and Characters)
聲明(Declarations)
自動(dòng)引用計(jì)數(shù)
Swift 里的值類型與引用類型
表達(dá)式(Expressions)
Swift 文檔修訂歷史
造個(gè)類型不是夢(mèng)-白話 Swift 類型創(chuàng)建
歡迎使用 Swift
詞法結(jié)構(gòu)(Lexical Structure)
集合類型(Collection Types)
下標(biāo)
方法(Methods)
可選鏈?zhǔn)秸{(diào)用
版本兼容性
類型轉(zhuǎn)換
構(gòu)造過程
The Swift Programming Language 中文版
函數(shù)(Functions)
Swift 教程
控制流(Control Flow)

下標(biāo)


1.0 翻譯:siemenliu 校對(duì):zq54zquan

2.0 翻譯+校對(duì):shanks

2.1 翻譯+校對(duì):shanks,Realank

2.2 校對(duì):SketchK 2016-05-13 3.0.1,shanks,2016-11-13

4.0 校對(duì):kemchenj 2017-09-21

4.1 翻譯+校對(duì):mylittleswift

本頁包含內(nèi)容:

下標(biāo)可以定義在類、結(jié)構(gòu)體和枚舉中,是訪問集合、列表或序列中元素的快捷方式。可以使用下標(biāo)的索引,設(shè)置和獲取值,而不需要再調(diào)用對(duì)應(yīng)的存取方法。舉例來說,用下標(biāo)訪問一個(gè) Array 實(shí)例中的元素可以寫作 someArray[index],訪問 Dictionary 實(shí)例中的元素可以寫作 someDictionary[key]。

一個(gè)類型可以定義多個(gè)下標(biāo),通過不同索引類型進(jìn)行重載。下標(biāo)不限于一維,你可以定義具有多個(gè)入?yún)⒌南聵?biāo)滿足自定義類型的需求。

下標(biāo)語法

下標(biāo)允許你通過在實(shí)例名稱后面的方括號(hào)中傳入一個(gè)或者多個(gè)索引值來對(duì)實(shí)例進(jìn)行存取。語法類似于實(shí)例方法語法和計(jì)算型屬性語法的混合。與定義實(shí)例方法類似,定義下標(biāo)使用 subscript 關(guān)鍵字,指定一個(gè)或多個(gè)輸入?yún)?shù)和返回類型;與實(shí)例方法不同的是,下標(biāo)可以設(shè)定為讀寫或只讀。這種行為由 getter 和 setter 實(shí)現(xiàn),有點(diǎn)類似計(jì)算型屬性:

subscript(index: Int) -> Int {
    get {
      // 返回一個(gè)適當(dāng)?shù)?Int 類型的值
    }

    set(newValue) {
      // 執(zhí)行適當(dāng)?shù)馁x值操作
    }
}

newValue 的類型和下標(biāo)的返回類型相同。如同計(jì)算型屬性,可以不指定 setter 的參數(shù)(newValue)。如果不指定參數(shù),setter 會(huì)提供一個(gè)名為 newValue 的默認(rèn)參數(shù)。

如同只讀計(jì)算型屬性,可以省略只讀下標(biāo)的 get 關(guān)鍵字:

subscript(index: Int) -> Int {
    // 返回一個(gè)適當(dāng)?shù)?Int 類型的值
}

下面代碼演示了只讀下標(biāo)的實(shí)現(xiàn),這里定義了一個(gè) TimesTable 結(jié)構(gòu)體,用來表示傳入整數(shù)的乘法表:

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// 打印 "six times three is 18"

在上例中,創(chuàng)建了一個(gè) TimesTable 實(shí)例,用來表示整數(shù) 3 的乘法表。數(shù)值 3 被傳遞給結(jié)構(gòu)體的構(gòu)造函數(shù),作為實(shí)例成員 multiplier 的值。

你可以通過下標(biāo)訪問 threeTimesTable 實(shí)例,例如上面演示的 threeTimesTable[6]。這條語句查詢了 3 的乘法表中的第六個(gè)元素,返回 36 倍即 18

注意

TimesTable 例子基于一個(gè)固定的數(shù)學(xué)公式,對(duì) threeTimesTable[someIndex] 進(jìn)行賦值操作并不合適,因此下標(biāo)定義為只讀的。

下標(biāo)用法

下標(biāo)的確切含義取決于使用場(chǎng)景。下標(biāo)通常作為訪問集合,列表或序列中元素的快捷方式。你可以針對(duì)自己特定的類或結(jié)構(gòu)體的功能來自由地以最恰當(dāng)?shù)姆绞綄?shí)現(xiàn)下標(biāo)。

例如,Swift 的 Dictionary 類型實(shí)現(xiàn)下標(biāo)用于對(duì)其實(shí)例中儲(chǔ)存的值進(jìn)行存取操作。為字典設(shè)值時(shí),在下標(biāo)中使用和字典的鍵類型相同的鍵,并把一個(gè)和字典的值類型相同的值賦給這個(gè)下標(biāo):

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

上例定義一個(gè)名為 numberOfLegs 的變量,并用一個(gè)包含三對(duì)鍵值的字典字面量初始化它。numberOfLegs 字典的類型被推斷為 [String: Int]。字典創(chuàng)建完成后,該例子通過下標(biāo)將 String 類型的鍵 birdInt 類型的值 2 添加到字典中。

更多關(guān)于 Dictionary 下標(biāo)的信息請(qǐng)參考讀取和修改字典

注意

Swift 的 Dictionary 類型的下標(biāo)接受并返回可選類型的值。上例中的 numberOfLegs 字典通過下標(biāo)返回的是一個(gè) Int? 或者說“可選的 int”。Dictionary 類型之所以如此實(shí)現(xiàn)下標(biāo),是因?yàn)椴皇敲總€(gè)鍵都有個(gè)對(duì)應(yīng)的值,同時(shí)這也提供了一種通過鍵刪除對(duì)應(yīng)值的方式,只需將鍵對(duì)應(yīng)的值賦值為 nil 即可。

下標(biāo)選項(xiàng)

下標(biāo)可以接受任意數(shù)量的入?yún)?,并且這些入?yún)⒖梢允侨我忸愋?。下?biāo)的返回值也可以是任意類型。下標(biāo)可以使用變量參數(shù)和可變參數(shù),但不能使用輸入輸出參數(shù),也不能給參數(shù)設(shè)置默認(rèn)值。

一個(gè)類或結(jié)構(gòu)體可以根據(jù)自身需要提供多個(gè)下標(biāo)實(shí)現(xiàn),使用下標(biāo)時(shí)將通過入?yún)⒌臄?shù)量和類型進(jìn)行區(qū)分,自動(dòng)匹配合適的下標(biāo),這就是下標(biāo)的重載

雖然接受單一入?yún)⒌南聵?biāo)是最常見的,但也可以根據(jù)情況定義接受多個(gè)入?yún)⒌南聵?biāo)。例如下例定義了一個(gè) Matrix 結(jié)構(gòu)體,用于表示一個(gè) Double 類型的二維矩陣。Matrix 結(jié)構(gòu)體的下標(biāo)接受兩個(gè)整型參數(shù):

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
        }
    }
}

Matrix 提供了一個(gè)接受兩個(gè)入?yún)⒌臉?gòu)造方法,入?yún)⒎謩e是 rowscolumns,創(chuàng)建了一個(gè)足夠容納 rows * columns 個(gè) Double 類型的值的數(shù)組。通過傳入數(shù)組長(zhǎng)度和初始值 0.0 到數(shù)組的構(gòu)造器,將矩陣中每個(gè)位置的值初始化為 0.0。關(guān)于數(shù)組的這種構(gòu)造方法請(qǐng)參考創(chuàng)建一個(gè)帶有默認(rèn)值的數(shù)組。

你可以通過傳入合適的 rowcolumn 的數(shù)量來構(gòu)造一個(gè)新的 Matrix 實(shí)例:

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

上例中創(chuàng)建了一個(gè) Matrix 實(shí)例來表示兩行兩列的矩陣。該 Matrix 實(shí)例的 grid 數(shù)組按照從左上到右下的閱讀順序?qū)⒕仃嚤馄交鎯?chǔ):

rowcolumn 的值傳入下標(biāo)來為矩陣設(shè)值,下標(biāo)的入?yún)⑹褂枚禾?hào)分隔:

matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

上面兩條語句分別調(diào)用下標(biāo)的 setter 將矩陣右上角位置(即 row0、column1 的位置)的值設(shè)置為 1.5,將矩陣左下角位置(即 row1、column0 的位置)的值設(shè)置為 3.2

Matrix 下標(biāo)的 getter 和 setter 中都含有斷言,用來檢查下標(biāo)入?yún)?rowcolumn 的值是否有效。為了方便進(jìn)行斷言,Matrix 包含了一個(gè)名為 indexIsValid(row:column:) 的便利方法,用來檢查入?yún)?rowcolumn 的值是否在矩陣范圍內(nèi):

func indexIsValid(row: Int, column: Int) -> Bool {
    return row >= 0 && row < rows && column >= 0 && column < columns
}

斷言在下標(biāo)越界時(shí)觸發(fā):

let someValue = matrix[2, 2]
// 斷言將會(huì)觸發(fā),因?yàn)?[2, 2] 已經(jīng)超過了 matrix 的范圍