继承:
就很java的继承一样
在 Swift 中,类可以调用和访问超类的方法,属性和下标脚本,并且可以重写它们。
语法:
class SomeClass: SomeSuperclass {
// 类的定义
}
子类可以通过继承来的实例方法,类方法,实例属性,或下标脚本来实现自己的定制功能,我们把这种行为叫重写(overriding)。
我们可以使用 override 关键字来实现重写。
如果我们想访问弗雷德方法 属性和下标脚本怎么办?
可以通过使用super前缀来访问超类的方法,属性或下标脚本。
class SuperClass {
func show() {
print("这是超类 SuperClass")
}
}
class SubClass: SuperClass {
override func show() {
print("这是子类 SubClass")
}
}
如果我们想在子类中重写属性,应该用什么?(如果父类需要修改自己的属性 那么用munting关键字)
你可以提供定制的 getter(或 setter)来重写任意继承来的属性,无论继承来的属性是存储型的还是计算型的属性。
子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性会有一个名字和类型。所以你在重写一个属性时,必需将它的名字和类型都写出来。
class Circle {
var radius = 12.5
var area: String {
return "矩形半径 \(radius) "
}
}
// 继承超类 Circle
class Rectangle: Circle {
var print = 7
override var area: String {
return super.area + " ,但现在被重写为 \(print)"
}
}
let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")
同样 可以用final关键字防止类或者属性被重写。
协议:
就是java里面的接口:
但是也是有一些不同的:
尽管协议本身并不实现任何功能,但是协议可以被当做类型来使用。
协议可以像其他普通类型一样使用,使用场景:
作为函数、方法或构造器中的参数类型或返回值类型
作为常量、变量或属性的类型
作为数组、字典或其他容器中的元素类型
protocol SomeProtocol {
// 协议内容
}
//自然接口可以继承其他接口
struct SomeStructure: FirstProtocol, AnotherProtocol {
// 结构体内容
}
//如果类在遵循协议的同时拥有父类,应该将父类名放在协议名之前,以逗号分隔。
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
// 类的内容
}
协议内容可以包括 属性和方法。
泛型:就是数据类型为T
和java一样
泛型让你写出灵活且可重用的函数和类型。
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}