方法 下标 继承

方法

方法是与某些特定类型相关联的函数。

实例方法(Instance Methods)

实例方法是属于某个特定类、结构体或枚举类型实例的方法。

self属性

类型的每一个属性都有一个隐含属性叫做self,self完全等同于该实例本身。

在实例方法中修改值类型

结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改。

但是,如果你确实需要在某个特定的方法中修改结构体或者枚举属性,你可以为这个方法选择可变(mutating)行为

1
2
3
4
5
6
7
Struct Point {
var x = 0.0 y = 0.0
mutating func moveByX(_ delateX: Double,_ delateY: Double){
x += delateX
y += delateY
}
}
在可变方法中给self赋值

可变方法能够赋给隐含属性self一个全新的实例。

1
2
3
4
5
6
struct Point {
var x = 0.0 , y = 0.0
mutating func moveByX(x delataX: Double, y delataY: Double){
self = Point(x: x + delateX, y: y + delataY)
}
}

类型方法

定义类型本身调用的方法叫类型方法。static关键字。类还可以用关键字class允许子类重写父类的方法实现。

1
2
3
4
5
6
class SomeClass {
class func someTypeMethod() {
// 在这里实现类型方法
}
}
SomeClass.someTypeMethod()

下标

下标可以定义在类、结构体和枚举中,是访问集合、列表或有序列表中元素的快捷方式。someArray[index] somDictionary[key]

一个类型可以定义多个下标,通过不同索引类型进行重载。下标不限于一维,你可以定义多个入参的下标满足自定义类型的需求。

下标语法

下标定义使用 subscript 关键字。下标可以设定读写或只读。

1
2
3
4
5
6
7
8
9
subscript(index: Int) -> Int{
get{
//返回一个适当的Int 类型的值
}
set(newValue){
//执行适当的赋值操作
}
}
//newValue 的类型和返回类型相同

如果只读计算型属性,可以省略只读下标的 get 关键字

1
2
3
subscript(index: int) -> Int{
//返回一个适当的Int 类型的值
}
1
2
3
4
5
6
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int{
return multipliter * index
}
}

下标用法

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

Swift 中Dictionary类型的下标接受并返回可选类型的值。Dictionary之所如此实现,是因为不是每个键都有个对应的值。同时这也提供了一种通过键删除对应值的方式,只需要将键对应的值赋值为nil即可

下标选项

下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型

1
2
3
4
5
6
7
8
9
var list = [Double]()
subscript(row: Int, column: Int) -> Double {
get{
return list[row * column]
}
set{
list[row *column] = newValue
}
}

继承

一个类可以继承另一个类的方法,属性和其他特性。继承是区分类与其它类型的基本特征。

可以为类中继承来的属性添加属性观察器,无论它原本被定义为存储属性还是计算属性

定义一个基类

不继承其它类的类,称之为基类

子类生成

子类生成指的是在一个已有类的基础上创建一个新的类。子类继承父类的特性,并且可以进一步完善。

重写

子类可以为继承来的实例方法,类方法,实例属性,或下标提供自己定制的实现。这种行为叫重写。

如果要重新某个特性,你需要在定义的前面加上override关键字。

访问父类的方法,属性及下标

  • 在方法 someMethod() 的重写实现中,可以通过 super.someMethod() 来调用父类版本的someMethod()方法
  • 在属性 someProperty() 的getter 或 setter实现中,可以通过 super.someProperty 来访问父类的属性
  • 在下标的重写实现中,可以通过 super[someindex]来访问父类版本中的相同下标
重写方法
重写属性

你可以提供定制的getter或setter来重写任意继承来的属性,无论继承来的属性是存储型属性还是计算型属性。

注意

  • 你可以将一个继承来的只读属性重写为一个读写属性,只需要在重新版本的属性里提供getter和setter即可。但是,你不可以将一个继承来的读写属性重写为一个只读属性

  • 如果你的重写属性中提供了setter,那么你也一定要提供getter。如果你不想在重写版本中的getter里修改继承来的属性值,你可以通过super.someProperty来返回继承来的值。

1
2
3
4
5
6
7
8
9
class Car : Vehicle {
var gear = 1
override func someOverrideFunc(){
//
}
override var desciption: String {
return super.description + "in gear\(gear)"
}
}
重写属性观察器

可以通过重写属性为一个继承来的属性添加属性观察器

你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以为他们提供willSet或didSet实现是不恰当的。

1
2
3
4
5
6
7
class AutomaticCar :Car {
override var currentSpeed: Double{
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}

防止重写

你可以通过方法、属性、下标前面添加final关键字来防止他们被重写:final varfinal funcfinal class funcfinal subscript

0%