Swift2.0語言教程之下標指令碼

大學霸發表於2015-07-22

Swift2.0語言教程之下標指令碼

下標指令碼

下標指令碼是訪問物件、集合或者序列的快速方式。開發者不需要呼叫例項特定的賦值和訪問方法,就可以直接訪問所需要的數值。例如在陣列中,可以直接使用下標去訪問或者修改陣列中的某一個元素。程式碼如下:


  • import Foundation
  • var array=["One","Two","Three","Four","Five"]
  • print("訪問元素:\(array[2])")
  • array[2]="Third"
  • print("訪問修改後的元素:\(array[2])")


執行結果如下:


  • 訪問元素:Three
  • 訪問修改後的元素:Third


Swift中,下標指令碼也可以定義在類中。這樣,開發者就可以像陣列一樣,快速訪問類中的屬性。本節將主要講解類中如何使用下標指令碼。

定義下標指令碼

下標指令碼透過subscript關鍵字進行定義,其定義形式如下:


  • subscript(引數名稱1:資料型別,引數名稱2:資料型別,…) ->返回值的資料型別 {
  •     get {
  •       // 返回與引數型別匹配的型別的值
  •     }
  •     set(引數名稱) {
  •       // 執行賦值操作
  •     }
  • }


注意:set引數名稱必須和下標指令碼定義的返回值型別相同,所以不為它指定資料型別。與計算屬性相同,set後面如果沒有宣告引數,那麼就使用預設的newValue

【示例8-18】以下將在類中定義一個下標指令碼,實現透過下標指令碼獲取某一屬性的值。程式碼如下:


  • class NewClass{
  •    var english:Int=0
  •     var chinese:Int=0
  • var math:Int=0
  • //定義下標指令碼
  •     subscript(index:Int)->Int{
  •         get{
  •             switch index{
  •                 case 0:
  •                     return english
  •                 case 1:
  •                     return chinese
  •                 case 2:
  •                     return math
  •                 default:
  •                     return 0
  •             }
  •         }
  •         set{
  •           english=newValue
  •             chinese=newValue
  •            math=newValue
  •         }
  •     }
  • }


呼叫下標指令碼

定義下標指令碼後,就可以進行呼叫了,其呼叫形式如下:


  • 例項物件[引數1,引數2,…]


其中,[]和它裡面的內容就代表了在類中定義的下標指令碼。

使用下標指令碼

下標指令碼可以根據傳入引數的不同,分為具有一個入參引數的下標指令碼和具有多個入參引數的下標指令碼。以下就是對這兩個下標指令碼在類中的使用。

1.具有一個傳入引數的下標指令碼

具有一個入參引數的下標指令碼是最常見的。在集合以及字串中使用的下標就是具有一個傳入引數的下標指令碼。

【示例8-19】以下程式透過使用下標指令碼計算3門成績的和。程式碼如下:


  • import Foundation
  • class Score{
  •     var english:Int=0
  •     var chinese:Int=0
  • var math:Int=0
  • //定義下標指令碼
  •     subscript(index:Int)->Int{
  •         get{
  •             switch index{
  •                 case 0:
  •                     return english
  •                 case 1:
  •                     return chinese
  •                 case 2:
  •                     return math
  •                 default:
  •                     return 0
  •             }
  •         }
  •         set{
  •           english=newValue
  •             chinese=newValue
  •            math=newValue
  •         }
  •     }
  • }
  • var myscore=Score()
  • var sum:Int=0
  • var i:Int=0
  • //遍歷
  • for i=0;i<3;++i{
  •     sum+=myscore[i]
  • }
  • print(sum)
  • //修改屬性值
  • myscore[0]=100
  • myscore[1]=90
  • myscore[2]=80
  • //遍歷求和
  • for i=0;i<3;++i{
  •     sum+=myscore[i]
  • }
  • print(sum)


執行結果如下所示:


  • 0
  • 240                                       


注意:下標指令碼可以和計算屬性一樣設定為讀寫或只讀。以上的程式碼是讀寫的形式。只讀的一般語法形式如下:


  • subscript(引數名稱:資料型別) -> Int {
  •     get{
  •    //返回與引數匹配的Int型別的值
  • }
  • }
  • 可以簡寫為以下的形式:
  • subscript(引數名稱:資料型別) -> Int {
  •     // 返回與引數匹配的Int型別的值
  • }


【示例8-20】以下就使用只讀的形式實現使用下標訪問屬性值的功能。程式碼如下:


  • import Foundation
  • class Score{
  •     var english:Int=50
  •     var chinese:Int=100
  • var math:Int=30
  • //定義下標指令碼
  •     subscript(index:Int)->Int{
  •             switch index{
  •                 case 0:
  •                     return english
  •                 case 1:
  •                     return chinese
  •                 case 2:
  •                     return math
  •                 default:
  •                     return 0
  •             }
  •     }
  • }
  • var myscore=Score()
  • var sum:Int=0
  • var i:Int=0
  • //遍歷輸出屬性值
  • for i=0;i<3;++i{
  •    print(myscore[i])
  • }


執行結果如下所示:


  • 50
  • 100
  • 30


2.具有多個引數的下標指令碼

具有一個入參引數的下標指令碼一般使用在多維維陣列中。以下就是使用具有兩個引數的下標為二維陣列賦值。程式碼如下:


  • import Foundation
  • var value:Int=0
  • class NewClass{
  •     var rows: Int = 0, columns: Int=0
  • 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
  •         }
  •     }
  • }
  • var matrix = NewClass(rows: 2, columns: 2)
  • print("沒有賦值前")
  • print(matrix[0,0])
  • print(matrix[0,1])
  • print(matrix[1,0])
  • print(matrix[1,1])
  • print("賦值後")
  • matrix[0,0]=1.0
  • matrix[0,1]=5.6
  • matrix[1,0]=2.4
  • matrix[1,1]=3.2
  • print(matrix[0,0])
  • print(matrix[0,1])
  • print(matrix[1,0])
  • print(matrix[1,1])


執行結果如下所示:


  • 沒有賦值前
  • 0.0
  • 0.0
  • 0.0
  • 0.0


賦值後


  • 1.0
  • 5.6
  • 2.4
  • 3.2


當然,下標指令碼除了可以對訪問物件以及物件中的屬性外,還可以實現一些自定義的功能,如以下的程式碼,此程式碼實現的功能是計算下標值和10的乘積。程式碼如下:


  • import Foundation
  • class NewClass{
  • var count1: Int=10
  • //定義下標指令碼
  •     subscript(index:Int) -> Int {
  •         get {
  •                           var count=index*count1
  •                          return count
  •         }
  •         set(newvalue){
  •               //執行賦值操作
  •                      count1=newvalue
  •         }
  •     }
  • }
  • let newClass=NewClass()
  • print(newClass.count1)
  • print(newClass[6])


執行結果如下:


  • 10
  • 60


本文選自:Swift2.0語言快速入門v3.0 大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29597077/viewspace-1744064/,如需轉載,請註明出處,否則將追究法律責任。

相關文章