结构体是功能仅逊于类的数据结构,其也可以描述拥有某些属性和行为的事物,只是它的实现机制和类有着本质的区别,应用场景也有所不同。
Swift语言中的数据类型分为值类型和引用类型。结构体、枚举以及前面读者接触到的除类以外的所有数据类型都属于值类型。只有类是引用类型的。值类型数据和引用类型数据最大的区别在于当进行数据传递时,值类型总是被复制,而引用类型不会被复制,引用类型是通过引用计数来管理其生命周期的。关于引用计数与内存管理,后面章节会专门介绍。读者在这里需要注意,如果值类型有数据传递,原来的实例会被复制一份,修改新的实例并不能修改原始的实例。
类有继承关系,结构体没有
final关键字用于修饰某些终极的属性、方法或者类
值类型进行比较操作,应使用等于运算符“==”;对引用类型进行比较操作,应使用等同运算符“===”,
结构体
struct Car {
var name:String
var oil:Double
var price:Double
mutating func addOil(_ parama:Double) { // mutating关键字可以在函数内操作属性
oil += 10
}
mutating func drive(){
oil -= 1;
}
}
var car = Car(name: "BYD", oil: 5, price: 100000)// 自动生成初始化方法
for _ in 0..<20 {
if car.oil < 5 {
car.drive()
car.addOil(100)
car.drive()
}else {
car.drive()
}
print(car.oil)
}
类语法
class CarClass {
var name:String
var oil:Double
var price:Double
init(name:String,oil:Double,price:Double){ //
self.name = name
self.oil = oil
self.price = price
}
}
类继承时重写init
//设计一个交通工具基类
class Transportation {
///默认提供10 注释被选中时会在代码提示中显示
var oil = 10
var name:String
init(name:String) {
self.name = name
}
}
class Car:Transportation {
var circleCount:Int
override init(name: String) {
self.circleCount = 4 // 重写父类init,参数名称类型一致,只需加入新属性的初始化,加override
super.init(name: name)
}
}
class Boat:Transportation {
var water:Int
init(water:Int,name:String) {// 重载init函数,加override
self.water = water
super.init(name: name)
}
}
网友评论