iOS Swift 中Class 和 Struct 的区别
在Swift中,Apple是大力提倡结构体的,很多基本的单元都变成了结构体。
比如Int,在OC中是基本数值类型,在Swift中变成了结构体。
OC中的基本数据类型NSInteger与Swift中的Int结构体
1.结构体是值类型,类是引用类型
Struct is value type while class is reference type
struct SRound {
var radius:Int?
}
let sr1 = SRound(radius: 2)
var sr2 = SRound()
sr2.radius = 4
print("sr1.radius is \(sr1.radius!)\nsr2.radius is \(sr2.radius!)\n")
var sr3 = sr2
sr2.radius = 100
print("sr2.radius is \(sr2.radius!)\nsr3.radius is \(sr3.radius!) ")
输出结果为
sr1.radius is 2
sr2.radius is 4
sr2.radius is 100
sr3.radius is 4
将值类型(Value Type)赋值给新的变量时,是值传递的,也就是copy一份给了新变量。
上例中,sr2结构体中,在sr2赋值给sr3时,sr2.radius 是4,sr3是一份全新的跟sr2一样的struct。
当sr2被改变时,并不能印象sr3。这也是值传递的本质。
相反地,class在赋值的时候则是引用传递(类似OC中指针传递)。
2.Struct(结构体)没有继承特性
Struct(结构体)没有继承特性
3.Class需要自己构建constructor
struct SRound {
var radius:Int?
var width:Int
}
let sr1 = SRound(radius: 2, width: 2) //自动生成的contructor
class CRound {
var radius:Int?
init(radius:Int?) { //自己构建的constructor
self.radius = radius
}
}
let cr1 = CRound(radius: 3)
当Struct中有成员不是可选型,该结构体的构建方法就必须包括所有成员参数及全员构造器,该构造器是默认生成的,只有所有成员都为可选型,可直接简单构造,如下:
struct SRound {
var radius:Int?
var width:Int
}
let sr1 = SRound(radius: 2, width: 2)
struct SRound2 {
var radius:Int?
var width:Int?
}
var sr2 = SRound2()
sr2.radius = 1
4.Struct改变内容受修饰符let影响,Class不受影响
let修饰的struct无法被改变,遵循变量修饰符let的通常用法,但let的此效果无法作用到class上
let对struct和class的影响
5.Struct方法的mutating修饰符
当struct方法中需要修改自身property时,方法需要前缀修饰符 mutating
stuct的mutating修饰符
修正如下:
struct SRound {
var radius:Int?
var width:Int
}
extension SRound {
mutating func changeRadius(radius:Int) {
self.radius = radius
}
}
class CRound {
var radius:Int?
init(radius:Int?) {
self.radius = radius
}
}
extension CRound {
func changeRadius(radius:Int) {
self.radius = radius
}
}
END
网友评论