亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Swift中文教程(十二) 下標(biāo)

系統(tǒng) 1916 0

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

?

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

?

1、下標(biāo)語(yǔ)法

下標(biāo)可以讓你通過(guò)實(shí)例名后加中括號(hào)內(nèi)一個(gè)或多個(gè)數(shù)值的形式檢索一個(gè)元素。語(yǔ)法和方法語(yǔ)法和屬性語(yǔ)法類似,通過(guò)使用subscript關(guān)鍵定義,一個(gè) 或多個(gè)輸入?yún)?shù)以及一個(gè)返回值。不同于實(shí)例方法的是,下標(biāo)可以是可讀寫(xiě)的或者只讀的。這種行為通過(guò)一個(gè)getter和setter語(yǔ)句聯(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)你不指定的時(shí)候,默認(rèn)參數(shù)newValue會(huì)被提供給setter。

?

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

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

下面是一個(gè)只讀下標(biāo)的實(shí)現(xiàn),定義了一個(gè)TimesTable結(jié)構(gòu)來(lái)表示一個(gè)整數(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"
    
?

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

?

注意:

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

?

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

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

?

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

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

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

?

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

?

注意:

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

?

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)方式,可以在需要的時(shí)候使用合適的下標(biāo)通過(guò)中括號(hào)中的參數(shù)返回需要的值。這種多下標(biāo)的定義被稱作下標(biāo)重載。

?

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

?

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

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

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

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

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

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

image

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

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

如果訪問(wèn)的矩陣越界的時(shí)候,斷言就會(huì)被觸發(fā):

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

?

?

感謝翻譯小組成員:李起攀( 微博 )、若晨( 微博 )、YAO、粽子、山有木兮木有枝、渺-Bessie、墨離、矮人王、CXH、Tiger大顧( 微博 )
個(gè)人轉(zhuǎn)載請(qǐng)注明出處和原始鏈接,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系我們~ 感謝您對(duì)我們工作的支持~

?

轉(zhuǎn)自: http://letsswift.com/2014/06/subscripts/

Swift中文教程(十二) 下標(biāo)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 在线免费观看毛片 | 伊人网久久网 | 欧美激情综合 | 全网毛片| 在线综合网 | 天天操操操| 成年人午夜影院 | 99国产精品久久久久久久... | 特级a欧美做爰片毛片 | 黄色毛片免费在线观看 | 性生活视频网址 | 天天射天天 | 日韩一区二区视频 | 国产精品国产三级国产a | 孕妇孕妇aaaaa级毛片视频 | 国产精品尹人在线观看免费 | 热99精品在线 | 国产成人久久精品推最新 | 久久精品久久精品久久精品 | 欧美日韩亚洲视频 | 国产成综合 | 国产美女在线观看 | 久久天天躁夜夜躁狠狠躁2015 | 手机看片日韩日韩 | 深夜免费看 | xxx毛片| 毛色毛片免费观看 | 日韩中文在线观看 | 久久精品国内一区二区三区 | 青草免费免费观看视频在线 | 99久久99久久久精品齐齐鬼色 | 久久99热只有视精品6国产 | 最近中文字幕无吗免费视频 | 欧美日本一道高清免费3区 欧美日本一道免费一区三区 | 亚洲在线精品视频 | 狠狠久久久久综合网 | 亚洲高清成人 | 日日碰夜夜 | 国产图片综合 | 毛片大全免费观看 | 奇米影视奇奇米色狠狠色777 |