標籤:pre bst sse 一個 結合 UNC substring set ==
實現一個我們自定的字串類,可以方便的通過索引擷取某一個字元值,或某一部分字串。同時也可以通過索引,給某一部分賦值。
class SubString{ var str:String = "" init(str:String) { self.str = str; } /**下標指令碼:擷取/設定部分字串**/ subscript(start:Int, length:Int) -> String { get{ let index1 = str.index(str.startIndex, offsetBy: start) let index2 = str.index(index1, offsetBy: length) let range = Range(uncheckedBounds: (lower: index1, upper: index2)) return str.substring(with: range) } set{ let tmp = str str = "" var s = "" var e = "" for (idx, item) in tmp.characters.enumerated() { if(idx < start) { s += "\(item)" } if(idx >= start + length) { e += "\(item)" } } str = s + newValue + e } } /**下標指令碼:擷取/設定字元**/ subscript(index:Int) -> String { get{ return String(str[str.index(str.startIndex, offsetBy: index)]) } set{ let tmp = str str = "" for (idx, item) in tmp.characters.enumerated() { if idx == index { str += "\(newValue)" }else{ str += "\(item)" } } } }} let str = SubString(str:"baibai.com")print(str[7,3]) //擷取字串:comprint(str[7]) //擷取字元:c str[7,3] = "COM" //設定部分字串str[0] = "H" //設定部分字元print(str[0,10]) /baibai.COM
通過類擴充,也可以直接給String類添加索引功能
extension String{ subscript(start:Int, length:Int) -> String { get{ let index1 = self.index(self.startIndex, offsetBy: start) let index2 = self.index(index1, offsetBy: length) let range = Range(uncheckedBounds: (lower: index1, upper: index2)) return self.substring(with: range) } set{ let tmp = self var s = "" var e = "" for (idx, item) in tmp.characters.enumerated() { if(idx < start) { s += "\(item)" } if(idx >= start + length) { e += "\(item)" } } self = s + newValue + e } } subscript(index:Int) -> String { get{ return String(self[self.index(self.startIndex, offsetBy: index)]) } set{ let tmp = self self = "" for (idx, item) in tmp.characters.enumerated() { if idx == index { self += "\(newValue)" }else{ self += "\(item)" } } } }} var str = "baibai.com"print(str[7,3])print(str[7]) str[7,3] = "COM"str[0] = "H" print(str[0,10])
使用一維數組結合下標方法一定程度上類比實現了二維數組
class 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 } }} let value = Matrix(rows: 20,columns: 20)value[10,10] = 20print(value[10,10])//20
Swift - 下標指令碼方法介紹及執行個體