Subscripts(下標)

//離上次學習swift過了好久,這才剛開始學習swift呀,堅持。

//下標
//“下標可以定義在類、結構體和枚舉中,是訪問集合,列表或序列中元素的快捷方式。可以使用下標的索引,設置和獲取值,而不需要再調用對應的存取方法”

//1.下標語法
//“下標允許你通過在實例名稱后面的方括號中傳入一個或者多個索引值來對實例進行存取。語法類似于實例方法語法和計算型屬性語法的混合。與定義實例方法類似,定義下標使用subscript關鍵字,指定一個或多個輸入參數和返回類型;與實例方法不同的是,下標可以設定為讀寫或只讀。這種行為由 getter 和 setter 實現,有點類似計算型屬性”

class SomeClass{
subscript(index:Int)->Int{
    get{
       //返回一個適當的Int類型的值
        return 1
    }
    set(newValue){
    //執(zhí)行適當的賦值操作
    }
}
}

//“newValue的類型和下標的返回類型相同。如同計算型屬性,可以不指定 setter 的參數(newValue)。如果不指定參數,setter 會提供一個名為newValue的默認參數”

//“如同只讀計算型屬性,可以省略只讀下標的get關鍵字”

struct TimesTable{
    let multiplier : Int
    subscript(index:Int)->Int{
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier:3)
print("six times  threes is \(threeTimesTable[6])")
//打印:six times  threes is 18

// 2. 下標用法
//“下標通常作為訪問集合,列表或序列中元素的快捷方式。你可以針對自己特定的類或結構體的功能來自由地以最恰當的方式實現下標。”

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

//“注意
//Swift 的Dictionary類型的下標接受并返回可選類型的值。上例中的numberOfLegs字典通過下標返回的是一個Int?或者說“可選的int”。Dictionary類型之所以如此實現下標,是因為不是每個鍵都有個對應的值,同時這也提供了一種通過鍵刪除對應值的方式,只需將鍵對應的值賦值為nil即可。”

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

struct Matrix{
    let rows : Int,columns : Int
    var grid : [Double]
    init(rows : Int,columns : Int) {
        self.rows = rows
        self.columns = columns
        grid = Array( repeating:0.0,count:rows * columns)
    }
    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: row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set{
            assert(indexIsValidForRow(row: row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

//“Matrix提供了一個接受兩個入參的構造方法,入參分別是rows和columns,創(chuàng)建了一個足夠容納rows * columns個Double類型的值的數組。通過傳入數組長度和初始值0.0到數組的構造器,將矩陣中每個位置的值初始化為0.0。”

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

//“創(chuàng)建了一個Matrix實例來表示兩行兩列的矩陣。該Matrix實例的grid數組按照從左上到右下的閱讀順序將矩陣扁平化存儲:”

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

//“上面兩條語句分別調用下標的 setter 將矩陣右上角位置(即row為0、column為1的位置)的值設置為1.5,將矩陣左下角位置(即row為1、column為0的位置)的值設置為3.2:”
//“Matrix下標的 getter 和 setter 中都含有斷言,用來檢查下標入參row和column的值是否有效。為了方便進行斷言,Matrix包含了一個名為indexIsValidForRow(_:column:)的便利方法,用來檢查入參row和column的值是否在矩陣范圍內”

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容