• <menu id="w2i4a"></menu>
  • logo Swift編程語言中文教程

    文檔首頁>>Swift編程語言中文教程>>Swift編程語言中文教程(十二):Swift附屬腳本(下標(biāo))

    Swift編程語言中文教程(十二):Swift附屬腳本(下標(biāo))


    結(jié)構(gòu)枚舉類型都可以通過定義下標(biāo)來訪問一組或者一個序列中的成員元素。通過下標(biāo)索引就可以方便地檢索和設(shè)置相應(yīng)的值,而不需要其他的額外操作。比如你可以通過someArray[index]來訪問數(shù)組中的元素,或者someDictionary[key]來對字典進(jìn)行索引。

    你可以為一個類型定義多個下標(biāo),以及適當(dāng)?shù)南聵?biāo)重載用來根據(jù)傳遞給下標(biāo)的索引來設(shè)置相應(yīng)的值。下標(biāo)不僅可以定義為一維的,還可以根據(jù)需要定義為多維的,多個參數(shù)的。

    1、下標(biāo)語法

    下標(biāo)可以讓你通過實(shí)例名后加中括號內(nèi)一個或多個數(shù)值的形式檢索一個元素。語法和方法語法和屬性語法類似,通過使用subscript關(guān)鍵定義,一個或多個輸入?yún)?shù)以及一個返回值。不同于實(shí)例方法的是,下標(biāo)可以是可讀寫的或者只讀的。這種行為通過一個getter和setter語句聯(lián)通,就像是計(jì)算屬性一樣。

    subscript(index: Int) -> Int {
        get {
            // return an appropriate subscript value here
        }
        set(newValue) {
            // perform a suitable setting action here
        }
    }

    newValue的類型和下標(biāo)返回的類型一樣。和計(jì)算屬性一樣,你可以選擇不指定setter的參數(shù),因?yàn)楫?dāng)你不指定的時候,默認(rèn)參數(shù)newValue會被提供給setter。

    和計(jì)算屬性一樣,只讀下標(biāo)可以不需要get關(guān)鍵詞:

    subscript(index: Int) -> Int {
        // return an appropriate subscript value here
    }

    下面是一個只讀下標(biāo)的實(shí)現(xiàn),定義了一個TimesTable結(jié)構(gòu)來表示一個整數(shù)的倍數(shù)表:

    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"

    在這個例子中,實(shí)例TimesTable被創(chuàng)建為3倍數(shù)表,這是通過在初始化的時候?yàn)閙ultiplier參數(shù)傳入的數(shù)值3設(shè)置的。

    注意:

    倍數(shù)表是根據(jù)特定的數(shù)學(xué)規(guī)則設(shè)置的,所以不應(yīng)該為threeTimeTable[someIndex]元素設(shè)置一個新值,所以TimesTable的下標(biāo)定義為只讀。

    2、下標(biāo)的使用

    下標(biāo)的具體含義由使用它時的上下文來確定。下標(biāo)主要用來作為集合,列表和序列的元素快捷方式。你可以自由的為你的類或者結(jié)構(gòu)定義你所需要的下標(biāo)。

    比如說,Swift中字典類型實(shí)現(xiàn)的下標(biāo)是設(shè)置和檢索字典實(shí)例中的值??梢酝ㄟ^分別給出下標(biāo)中的關(guān)鍵詞和值來設(shè)置多個值,也可以通過下標(biāo)來設(shè)置單個字典的值:

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

    上面的例子中定義了一個變量numberOfLegs,然后通過鍵值對初始化。numberOfLegs的類型是字典類型Dictionary<String, Int>。在字典創(chuàng)建之后,例子使用了下標(biāo)賦值方法添加了一個類型為字符串的鍵”bird”和Int值2到字典中。

    更多關(guān)于字典的下標(biāo)可以參考:訪問和修改字典這一章節(jié)

    注意:

    Swift中字典類型實(shí)現(xiàn)的鍵值對下標(biāo)是可選類型。對于numberOfLges字典來說,返回的值是Int?,也就是可選Int值。字典的這種使用可選類型下標(biāo)的方式說明不是所有的鍵都有對應(yīng)的值。同樣也可以通過給鍵賦值nil來刪除這個鍵。

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

    下標(biāo)可以接收任意數(shù)量的參數(shù),參數(shù)的類型也可以各異。下標(biāo)還可以返回任何類型的值。下標(biāo)可以使用變量參數(shù)或者可變參數(shù),但是不能夠使用輸入輸出參數(shù)或者提供默認(rèn)參數(shù)的值。

    類或者結(jié)構(gòu)可以根據(jù)需要實(shí)現(xiàn)各種下標(biāo)方式,可以在需要的時候使用合適的下標(biāo)通過中括號中的參數(shù)返回需要的值。這種多下標(biāo)的定義被稱作下標(biāo)重載。

    當(dāng)然,最常見的下標(biāo)用法是單個參數(shù),也可以定義多個參數(shù)的下標(biāo)。下面的例子演示了一個矩陣Matrix結(jié)構(gòu),它含有二維的Double值。矩陣結(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(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提供了一個初始化方法,使用兩個參數(shù)rows和columns,然后建立了一個數(shù)組來存儲類型為Double的值rows*columns。每個矩陣中的位置都被設(shè)置了一個初始值0.0。通過傳遞初始值0.0和數(shù)組長度給數(shù)組初始化方法完成上述操作。數(shù)組的初始化方法在:創(chuàng)建和初始化數(shù)組中有更詳細(xì)的敘述。

    你可以傳遞兩個參數(shù)row和column來完成Matrix的初始化:

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

    上面的初始化操作創(chuàng)建了一個兩行兩列的矩陣Matrix實(shí)例。這個矩陣實(shí)例的grid數(shù)組看起來是平坦的,但是實(shí)際上是矩陣從左上到右下的一維存儲形式。

    Swift編程語言中文教程(十二):Swift的附屬腳本(下標(biāo))

    矩陣中的值可以通過使用包含row和column以及逗號的下標(biāo)來設(shè)置:

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

    這兩個語句調(diào)用了下標(biāo)的setter方法為右上和左下角的兩個元素分別賦值1.5和3.2

    Swift編程語言中文教程(十二):Swift的附屬腳本(下標(biāo))

    矩陣下標(biāo)的getter和setter方法都包括了一個斷言語句來檢查下標(biāo)row和column是否有效。通過indexIsValid方法來判斷row和column是否在矩陣的范圍內(nèi):

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

    如果訪問的矩陣越界的時候,斷言就會被觸發(fā):

    let someValue = matrix[2, 2]
    // this triggers an assert, because [2, 2] is outside of the matrix bounds

    本文資源來自互聯(lián)網(wǎng),由本網(wǎng)整理編輯,供大家學(xué)習(xí)參考。因?yàn)榧夹g(shù)有限,可能會有不足及錯誤,請大家指正。

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();