1.初始化方法的不同
Struct會有一個(gè)默認(rèn)的初始化函數(shù)
struct Point {
var x :Int
var y : Int
}
Class不同,必須手動實(shí)現(xiàn)一個(gè)初始化函數(shù)
//報(bào)錯(cuò)
//class PointRef{
// var x :Int
// var y :Int
//}
class PointRef{
var x :Int
var y :Int
init(x:Int,y:Int){
self.x = x
self.y = y
}
}
2.Class 和 Struct在let常量上的不同
Class的常量可以修改屬性值杜跷,而Struct不可以
let p = Point(x: 1,y:2)
let p2 = PointRef(x: 2,y:3)
let p3 = PointRef(x: 2,y:3)
let p4 = p2
//p.x = 1 //報(bào)錯(cuò)
p2.x = 2 //不會報(bào)錯(cuò)
//p2 = p3 //報(bào)錯(cuò)
3.Swift為Class提供了一個(gè)指針判斷的操作符 ===
判斷兩個(gè)指針是否指向相同的對象
p2 === p3
p2 === p4
4.Struct和Class在函數(shù)聲明上的不同
Struct在函數(shù)中修改自己本身的值需要加上mutating關(guān)鍵字
struct Point {
var x :Int
var y : Int
//報(bào)錯(cuò)
// func move(x:Int,y:Int){
// self.x += x
// self.y += y
// }
mutating func move(x:Int,y:Int){
self.x += x
self.y += y
}
}
在class中可以直接修改
class PointRef{
var x :Int
var y :Int
init(x:Int,y:Int){
self.x = x
self.y = y
}
func move(x:Int,y:Int){
self.x += x
self.y += y
}
}
5.賦值語義上的區(qū)別
間接修改屬性的值傍念,struct并不會影響原始數(shù)據(jù)本身,因?yàn)镾truct是值類型葛闷,每次賦值都是一次值拷貝
var p5 = p2
p5.x = 10
p2.x //10
而class不同憋槐,每一次賦值都是只賦值指針本身,而不是重新創(chuàng)建一個(gè)新的內(nèi)存區(qū)域
var p6 = p
p6.x = 10
p.x //1