中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

2.12 下標腳本(Subscripts)

發布時間:2020-04-08 18:55:17 來源:網絡 閱讀:299 作者:Im劉亞芳 欄目:移動開發

下標腳本(Subscripts)


本頁包含內容:

  • 下標腳本語法

  • 下標腳本用法

  • 下標腳本選項

下標腳本 可以定義在類(Class)、結構體(structure)和枚舉(enumeration)這些目標中,可以認為是訪問對象、集合或序列的快捷方式,不需要再調用實例的特定的賦值和訪問方法。舉例來說,用下標腳本訪問一個數組(Array)實例中的元素可以這樣寫 someArray[index] ,訪問字典(Dictionary)實例中的元素可以這樣寫someDictionary[key]

對于同一個目標可以定義多個下標腳本,通過索引值類型的不同來進行重載,而且索引值的個數可以是多個。

譯者:這里附屬腳本重載在本小節中原文并沒有任何演示

下標腳本語法

下標腳本允許你通過在實例后面的方括號中傳入一個或者多個的索引值來對實例進行訪問和賦值。語法類似于實例方法和計算型屬性的混合。與定義實例方法類似,定義下標腳本使用subscript關鍵字,顯式聲明入參(一個或多個)和返回類型。與實例方法不同的是下標腳本可以設定為讀寫或只讀。這種方式又有點像計算型屬性的getter和setter:

subscript(index: Int) -> Int {    get {      // 返回與入參匹配的Int類型的值
    }    set(newValue) {      // 執行賦值操作
    }
}

newValue的類型必須和下標腳本定義的返回類型相同。與計算型屬性相同的是set的入參聲明newValue就算不寫,在set代碼塊中依然可以使用默認的newValue這個變量來訪問新賦的值。

與只讀計算型屬性一樣,可以直接將原本應該寫在get代碼塊中的代碼寫在subscript中:

subscript(index: Int) -> Int {    // 返回與入參匹配的Int類型的值}

下面代碼演示了一個在TimesTable結構體中使用只讀下標腳本的用法,該結構體用來展示傳入整數的n倍。

struct TimesTable {    let multiplier: Int
    subscript(index: Int) -> Int {      return multiplier * index
    }
}let threeTimesTable = TimesTable(multiplier: 3)println("3的6倍是\(threeTimesTable[6])")// 輸出 "3的6倍是18"

在上例中,通過TimesTable結構體創建了一個用來表示索引值三倍的實例。數值3作為結構體構造函數入參初始化實例成員multiplier

你可以通過下標腳本來得到結果,比如threeTimesTable[6]。這條語句訪問了threeTimesTable的第六個元素,返回63倍即18

注意:
TimesTable例子是基于一個固定的數學公式。它并不適合開放寫權限來對threeTimesTable[someIndex]進行賦值操作,這也是為什么附屬腳本只定義為只讀的原因。

下標腳本用法

根據使用場景不同下標腳本也具有不同的含義。通常下標腳本是用來訪問集合(collection),列表(list)或序列(sequence)中元素的快捷方式。你可以在你自己特定的類或結構體中自由的實現下標腳本來提供合適的功能。

例如,Swift 的字典(Dictionary)實現了通過下標腳本來對其實例中存放的值進行存取操作。在下標腳本中使用和字典索引相同類型的值,并且把一個字典值類型的值賦值給這個下標腳本來為字典設值:

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

上例定義一個名為numberOfLegs的變量并用一個字典字面量初始化出了包含三對鍵值的字典實例。numberOfLegs的字典存放值類型推斷為Dictionary<String, Int>。字典實例創建完成之后通過下標腳本的方式將整型值2賦值到字典實例的索引為bird的位置中。

更多關于字典(Dictionary)下標腳本的信息請參考讀取和修改字典

注意:
Swift 中字典的附屬腳本實現中,在get部分返回值是Int?,上例中的numberOfLegs字典通過附屬腳本返回的是一個Int?或者說“可選的int”,不是每個字典的索引都能得到一個整型值,對于沒有設過值的索引的訪問返回的結果就是nil;同樣想要從字典實例中刪除某個索引下的值也只需要給這個索引賦值為nil即可。

下標腳本選項

下標腳本允許任意數量的入參索引,并且每個入參類型也沒有限制。下標腳本的返回值也可以是任何類型。下標腳本可以使用變量參數和可變參數,但使用寫入讀出(in-out)參數或給參數設置默認值都是不允許的。

一個類或結構體可以根據自身需要提供多個下標腳本實現,在定義下標腳本時通過入參個類型進行區分,使用下標腳本時會自動匹配合適的下標腳本實現運行,這就是下標腳本的重載

一個下標腳本入參是最常見的情況,但只要有合適的場景也可以定義多個下標腳本入參。如下例定義了一個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提供了一個兩個入參的構造方法,入參分別是rowscolumns,創建了一個足夠容納rows * columns個數的Double類型數組。為了存儲,將數組的大小和數組每個元素初始值0.0,都傳入數組的構造方法中來創建一個正確大小的新數組。關于數組的構造方法和析構方法請參考創建并且構造一個數組。

你可以通過傳入合適的rowcolumn的數量來構造一個新的Matrix實例:

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

上例中創建了一個新的兩行兩列的Matrix實例。在閱讀順序從左上到右下的Matrix實例中的數組實例grid是矩陣二維數組的扁平化存儲:

// 示意圖grid = [0.0, 0.0, 0.0, 0.0]

      col0  col1
row0   [0.0,     0.0,
row1    0.0,  0.0]

將值賦給帶有rowcolumn下標腳本的matrix實例表達式可以完成賦值操作,下標腳本入參使用逗號分割

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

上面兩條語句分別讓matrix的右上值為 1.5,坐下值為 3.2:

[0.0, 1.5, 3.2, 0.0]

Matrix下標腳本的gettersetter中同時調用了下標腳本入參的rowcolumn是否有效的判斷。為了方便進行斷言,Matrix包含了一個名為indexIsValid的成員方法,用來確認入參的rowcolumn值是否會造成數組越界:

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

斷言在下標腳本越界時觸發:

let someValue = matrix[2, 2]// 斷言將會觸發,因為 [2, 2] 已經超過了matrix的最大長度


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

化州市| 碌曲县| 贵阳市| 阿拉善左旗| 汶川县| 绥阳县| 禹州市| 遂川县| 莎车县| 广宁县| 肇州县| 东平县| 黎平县| 宝清县| 庆安县| 金阳县| 精河县| 舒城县| 兴仁县| 灵台县| 尼玛县| 申扎县| 浏阳市| 成武县| 高青县| 盱眙县| 贡山| 洛浦县| 乃东县| 罗城| 电白县| 邯郸县| 昌宁县| 东港市| 麦盖提县| 商城县| 广平县| 鄂州市| 密山市| 岑巩县| 龙里县|