书接上回 继续讨论结构体和类.

1. 方法

在Swift中,除了类之外,结构体和枚举都能够定义方法.与结构体相比,类还有如下的附加功能:

  • 继承允许一个类继承另一个类的特征
  • 类型转换允许在运行时检查和解释一个类实例的类型
  • 析构器允许一个类实例释放任何其所被分配的资源
  • 引用计数允许对一个类的多次引用

    1.1 在实例方法中修改值类型

    结构体和枚举是值类型,默认情况下,值类型的属性不能像类一样在它的实例方法中被修改.如果需要对其进行修改,可以在修改的方法中选择mutating行为,便可以改变结构体的属性,并且在方法执行结束后写回到原始结构.甚至还可以给self赋予全新的实例,在方法执行结束后替换现存实例.

    e.g.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
      struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
    x += deltaX
    y += deltaY
    }
    }
    var somePoint = Point(x: 1.0, y: 1.0)
    somePoint.moveBy(x: 2.0, y: 3.0)
    print("The point is now at (\(somePoint.x), \(somePoint.y))")
    // 打印“The point is now at (3.0, 4.0)”



    enum TriStateSwitch {
    case off, low, high
    mutating func next() {
    switch self {
    case .off:
    self = .low
    case .low:
    self = .high
    case .high:
    self = .off
    }
    }
    }
    var ovenLight = TriStateSwitch.low
    ovenLight.next()
    // ovenLight 现在等于 .high
    ovenLight.next()
    // ovenLight 现在等于 .off

    1.2 类型方法

    类型方法是指在类型本身上调用的方法.在方法的fun之前加static关键字,可以指定类型方法,还可以用关键字class来指定,从而允许子类重写该方法的实现.

2.下标

下标可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。

2.1 下标语法

下标允许你通过在实例名称后面的方括号中传入一个或者多个索引值来对实例进行存取。语法类似于实例方法语法和计算型属性语法的混合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  subscript(index: Int) -> Int {
get {
// 返回一个适当的 Int 类型的值
}
set(newValue) {
// 执行适当的赋值操作
}
}

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

可以设置读写和只读

2.2 下标选项

下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。下标可以使用可变参数,并且可以提供默认参数数值,但是不能使用输入输出参数。

下标可以重载

3.构造过程

如果结构体或类为所有属性提供了默认值,又没有提供任何自定义的构造器,那么 Swift 会给这些结构体或类提供一个默认构造器。这个默认构造器将简单地创建一个所有属性值都设置为它们默认值的实例。

结构体如果没有定义任何自定义构造器,它们将自动获得一个逐一成员构造器(memberwise initializer)。不像默认构造器,即使存储型属性没有默认值,结构体也能会获得逐一成员构造器。当你调用一个逐一成员构造器(memberwise initializer)时,可以省略任何一个有默认值的属性。

原文链接 http://blog.wuqingzhe.cn/2019/08/15/swift3/