Swift 下标脚本
下标脚本 可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。
下标脚本对传入参数类型没有任何限制,参数的个数没有限制,返回值也没有任何限制,但是传入参数不能是in-out类型,也不可以设置默认值。某些情况下 在一个类或一个结构体中可以存在多个下标脚本,区分它们的主要方法就是传入的参数和返回值。
举例来说,用下标脚本访问一个数组(Array)实例中的元素可以这样写 someArray[index] ,访问字典(Dictionary)实例中的元素可以这样写 someDictionary[key]。
语法
subscript(index: Int) -> Int {
get {
// 用于下标脚本值的声明
}
set(newValue) {
// 执行赋值操作
}
}
下标脚本的重载
struct Matrix {
let rows: Int, columns: Int
var print: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
print = Array(repeating: 0.0, count: rows * columns)
}
subscript(row: Int, column: Int) -> Double {
get {
return print[(row * columns) + column]
}
set {
print[(row * columns) + column] = newValue
}
}
}
// 创建了一个新的 3 行 3 列的Matrix实例
var mat = Matrix(rows: 3, columns: 3)
// 通过下标脚本设置值
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,1] = 5.0
// 通过下标脚本获取值
print("\(mat[0,0])")
print("\(mat[0,1])")
print("\(mat[1,0])")
print("\(mat[1,1])")
运行结果
1.0
2.0
3.0
5.0
参考 —— [ 菜鸟教程]
字符串的截取
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 = "hangge.com"
print(str[7,3])
print(str[7])
str[7,3] = "COM"
str[0] = "H"
print(str[0,10])
运行结果
com
c
Hangge.COM
使用一维数组结合下标方法一定程度上模拟实现了二维数组
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] = 20
print(value[10,10])
参考 —— [链接]