初探Swift下標語法

定義下標使用subscript關鍵字, 形式如下:

subscript(index: Int) -> Int {
    get {
      // 返回一個適當的 Int 類型的值
    }

    set(newValue) {
      // 執行適當的賦值操作
    }
}

只讀下標的實現 例:

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"

在上例中,創建了一個TimesTable實例,用來表示整數3的乘法表。數值3被傳遞給結構體的構造函數,作為實例成員multiplier的值。

下標用法

下標的確切含義取決于使用場景。下標通常作為訪問集合,列表或序列中元素的快捷方式。你可以針對自己特定的類或結構體的功能來自由地以最恰當的方式實現下標。

下標選項

  • 下標可以接受任意數量的入參,并且這些入參可以是任意類型。下標的返回值也可以是任意類型。下標可以使用變量參數和可變參數,但不能使用輸入輸出參數,也不能給參數設置默認值。
  • 一個類或結構體可以根據自身需要提供多個下標實現,使用下標時將通過入參的數量和類型進行區分,自動匹配合適的下標,這就是下標的重載。

雖然接受單一入參的下標是最常見的,但也可以根據情況定義接受多個入參的下標。例如下例定義了一個Matrix結構體,用于表示一個Double類型的二維矩陣。Matrix結構體的下標接受兩個整型參數:

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)
    }
    func indexIsValidForRow(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

Matrix提供了一個接受兩個入參的構造方法,入參分別是rows和columns,創建了一個足夠容納rows * columns個Double類型的值的數組。通過傳入數組長度和初始值0.0到數組的構造器,將矩陣中每個位置的值初始化為0.0
你可以通過傳入合適的row和column的數量來構造一個新的Matrix實例:

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

將row和column的值傳入下標來為矩陣設值,下標的入參使用逗號分隔:

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

Matrix下標的 getter 和 setter 中都含有斷言,用來檢查下標入參row和column的值是否有效。為了方便進行斷言,Matrix包含了一個名為indexIsValidForRow(_:column:)的便利方法,用來檢查入參row和column的值是否在矩陣范圍內:

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

斷言在下標越界時觸發:

let someValue = matrix[2, 2]
// 斷言將會觸發,因為 [2, 2] 已經超過了 matrix 的范圍
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • 本章將會介紹 下標語法下標用法下標選項定義一個基類子類生成重寫防止重寫 下標 下標可以定義在類、結構體和枚舉中,是...
    寒橋閱讀 455評論 0 1
  • 1. 屬性 屬性將值跟特定的類、結構或枚舉關聯。存儲屬性存儲常量或變量作為實例的一部分,而計算屬性計算(不是存儲)...
    路飛_Luck閱讀 168評論 0 0
  • 官方文檔 下標腳本 類,結構體和枚舉可以定義下標腳本,下標腳本可以認為是訪問集合(collection),列表或序...
    hrscy閱讀 254評論 1 1
  • 信風吹過青石的巷灣,吹動水藍色的衫 曳地而動的裙角,微微飄蕩 蒲英、小鎮、回憶呼嘯而過 濺起內心透明的哀傷,似曾相...
    ychl閱讀 204評論 1 0
  • 幾年前我入行作心理咨詢,第一個體驗的課程就是“內在小孩”。 記得當時,四天的課程,我暴哭了四天。 陳年的痛,象開閘...
    釋然心理閱讀 2,764評論 1 3