下標(biāo)

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

[TOC]

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

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

下標(biāo)語法

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

subscript(index: Int) -> Int {
    get {
        // 返回一個適當(dāng)?shù)腎nt類型值
    }
    set(newValue) {
        // 執(zhí)行適當(dāng)?shù)馁x值操作
    }
}

newValue的類型和下標(biāo)的返回類型相同卒暂,如同計算型屬性啄栓,可以不指定setter的參數(shù),如果不指定參數(shù)也祠,setter會提供一個名為newValue的默認(rèn)參數(shù)昙楚。

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

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

下面的代碼演示了只讀下標(biāo)的實(shí)現(xiàn)诈嘿,這里定義了一個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)建了一個TimesTable實(shí)例,用來表示整數(shù)3的乘法表淳梦。數(shù)值3被傳遞給結(jié)構(gòu)體的構(gòu)造函數(shù)佩耳,作為實(shí)例成員multiplier的值。

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

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

下標(biāo)用法

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

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

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

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

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

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

下標(biāo)可以接受任意數(shù)量的入?yún)ⅲ⑶疫@些入?yún)⒖梢允侨我忸愋吞枰健O聵?biāo)的返回值也可以是任意類型耕漱。下標(biāo)也可以使用變量參數(shù)可變參數(shù)算色,但不能使用輸入輸出參數(shù)抬伺,也不能給參數(shù)設(shè)置默認(rèn)值。

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

雖然接受單一入?yún)⒌南聵?biāo)時最常見的能岩,但也可以根據(jù)情況定義接受多個入?yún)⒌南聵?biāo)寞宫。

例如下例定義了一個Matrix結(jié)構(gòu)體,用于表示一個Double類型的二維矩陣拉鹃。Matrix結(jié)構(gòu)體的下標(biāo)接受兩個整型參數(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 {
        set {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
        get {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            return grid[(row * columns) + column]
 
        }
    }
}

Matrix提供了一個接受兩個入?yún)⒌臉?gòu)造方法辈赋,入?yún)⒎謩e是rowscolumns,創(chuàng)建了一個足夠容納rows * columnsDouble類型的值的數(shù)組膏燕。通過傳入數(shù)組長度和初始值0.0到數(shù)組的構(gòu)造器钥屈,將矩陣中每個位置的值初始化為0.0赋咽。

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

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

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

[圖片上傳失敗...(image-bed4b2-1520405596285)]

rowcolumn的值傳入下標(biāo)來為矩陣設(shè)值塞淹,下標(biāo)的入?yún)⑹褂枚禾柗指簦?/p>

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

[圖片上傳失敗...(image-c75ac0-1520405596285)]

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

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

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

let someValue = matrix[2, 2]
// 斷言將會觸發(fā),因?yàn)?[2, 2] 已經(jīng)超過了 matrix 的范圍
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锯玛,一起剝皮案震驚了整個濱河市鼎姐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌更振,老刑警劉巖炕桨,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肯腕,居然都是意外死亡献宫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門实撒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姊途,“玉大人,你說我怎么就攤上這事知态〗堇迹” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵负敏,是天一觀的道長贡茅。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么顶考? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任赁还,我火速辦了婚禮,結(jié)果婚禮上驹沿,老公的妹妹穿的比我還像新娘艘策。我一直安慰自己,他們只是感情好渊季,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布朋蔫。 她就那樣靜靜地躺著,像睡著了一般却汉。 火紅的嫁衣襯著肌膚如雪斑举。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天病涨,我揣著相機(jī)與錄音富玷,去河邊找鬼。 笑死既穆,一個胖子當(dāng)著我的面吹牛赎懦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幻工,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼励两,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囊颅?” 一聲冷哼從身側(cè)響起当悔,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踢代,沒想到半個月后盲憎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胳挎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年饼疙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慕爬。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窑眯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出医窿,到底是詐尸還是另有隱情磅甩,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布姥卢,位于F島的核電站卷要,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜却妨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一饵逐、第九天 我趴在偏房一處隱蔽的房頂上張望括眠。 院中可真熱鬧彪标,春花似錦、人聲如沸掷豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽当船。三九已至题画,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間德频,已是汗流浹背苍息。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壹置,地道東北人竞思。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像钞护,于是被迫代替她去往敵國和親盖喷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本章將會介紹 下標(biāo)語法下標(biāo)用法下標(biāo)選項(xiàng)定義一個基類子類生成重寫防止重寫 下標(biāo) 下標(biāo)可以定義在類、結(jié)構(gòu)體和枚舉中余佃,是...
    寒橋閱讀 438評論 0 1
  • 官方文檔 下標(biāo)腳本 類暮刃,結(jié)構(gòu)體和枚舉可以定義下標(biāo)腳本,下標(biāo)腳本可以認(rèn)為是訪問集合(collection)爆土,列表或序...
    hrscy閱讀 248評論 1 1
  • //離上次學(xué)習(xí)swift過了好久沾歪,這才剛開始學(xué)習(xí)swift呀,堅持雾消。 //下標(biāo)//“下標(biāo)可以定義在類灾搏、結(jié)構(gòu)體和枚舉...
    你weixiao的時候很美閱讀 571評論 0 0
  • 我想—— 因?yàn)橄肽懔?清風(fēng)已離別相遇的路口 也帶不走枯葉一片 只是在茫茫的世界 將深情揉進(jìn)了秋意 我想—— 因?yàn)橄?..
    靜若繁花L閱讀 476評論 17 17
  • 似乎我身邊離得最近的男性只有我的爸爸、哥哥立润、弟弟狂窑。跟很多女生有藍(lán)顏知己一樣,我會跟老爸說很多事情桑腮。 每當(dāng)我聽到別人...
    施米諾閱讀 411評論 0 0