class Dog{
var name: String
var breed: String
//自定义初始化器
init(name: String,breed: String){
self.name = name
self.breed = breed
}
func makeMethod(){
print("This is a Base class.")
}
}
var dog = Dog(name: "wangxun", breed: "wx")
print(dog.name)
class Poodle: Dog{
init(name:String){
//为了安全起见,Swift总是让您从子类中调用super.init(),以防万一父类在创建时会做一些重要的工作。
super.init(name: name, breed: "poodle")
}
}
var poodle = Poodle(name: "wangxun")
print(poodle.breed)
关键字:
override
class Poodle: Dog{
init(name:String){
//为了安全起见,Swift总是让您从子类中调用super.init(),以防万一父类在创建时会做一些重要的工作。
super.init(name: name, breed: "poodle")
}
override func makeMethod() {
print("This is override Class.")
}
}
var poodle = Poodle(name: "wangxun")
print(poodle.breed)
poodle.makeMethod()
final class
)如果一个类被声明为【
final
】,则任何类都不可从此类继承
关键字:final
final class Cat{
var name: String
var age: Int
init(name:String,age: Int){
self.name = name
self.age = age
}
}
//class CatTest:Cat{ }❌
class Singer {
var name = "Taylor Swift"
}
var singer = Singer()
var singerCopy = singer
print("singer: \(singer.name) singerCopy: \(singerCopy.name)")
singerCopy.name = "Justin Bieber"
print("singer: \(singer.name) singerCopy: \(singerCopy.name)")
struct Bird {
var name = "Taylor Swift"
}
var bird = Bird()
var birdCopy = bird
print("bird: \(bird.name) birdCopy: \(birdCopy.name)")
birdCopy.name = "Justin Bieber"
print("bird: \(bird.name) birdCopy: \(birdCopy.name)")
当类的实例被销毁时运行的代码
关键字:deinit
class Person {
init(){
print("This is a Init.")
}
deinit {
print("This is a Deinit.")
}
}
var person = Person()
若常量结构中带有可变属性,该属性不可变
若常量类中带有可变属性,该属性可变,因此类不需要mutating
- 类永远不会带有成员初始化器,当类中有属性则必须创建自己的初始化器
- 继承 通过现有类创建一个新的类,它继承了原始类的所有属性和方法,并且可以在其顶部添加自己的属性
- 类型不同 结构体是【值类型】,类是【引用类型】
- 类可以拥有反初始化器
- 处理常量的方式不同
- 类和结构体相似,它们都可以让您使用属性和方法创建自己的类型。
- 一个类可以从另一个类继承,并获得父类的所有属性和方法。讨论类层次结构很常见——一个类基于另一个类,而另一个类本身又基于另一个类。
- 您可以使用final关键字标记一个类,这将阻止其他类从该类继承。
- 通过方法重写,子类可以使用新的实现替换其父类中的方法。
- 当两个变量指向同一类实例时,它们都指向同一块内存——改变一个会改变另一个。
- 类可以具有一个反初始化器,该反初始化器是在销毁该类的实例时运行的代码。
- 类对常量的强制性不如结构强——如果将属性声明为变量,则无论如何创建类实例,都可以对其进行更改。