结构体是值类型,类是引用类型(值类型赋值就是copy一份,而引用类型赋值是不同的名字指向同一个内存空间)
结构体可以不写init方法,系统会默认有一个,类中,如果不赋初值,就必须要自己写一个init方法
class Person {
var name:String
var age:Int
init(name:String, age:Int) {
self.name = name
self.age = age
}
}
如果赋了初值,就可以,可以不写init,初始化也可以这样
let p2 = Person()
在结构体中,如果属性是var,但是实例出来的是let,那么,还是不能修改var属性的值,例子
struct text {
var name:String
var age:Int
}
let textOne = text(name: "ref", age: 12)
textOne.age = 13//这里是错误的,虽然age是var,但是textOne是let,就不能修改,如果textOne是var,就可以修改
类中情况就不一样
let p1 = Person(name: "ref", age: 14)
p1.age = 16//这里p1是let,但是也可以修改age的值
原因就是类是引用类型,其实这里的p1,是一个指针,指向一块内存空间,这里的let是限制了p1这个指针不能指向别的空间,而不是限制这块空间内的东西,所以是可以修改的
结构体是值类型,let限制的是这块内存的东西,当然就是不能修改的
再来看一个例子
class Person {
var name:String
var age:Int
init(name:String, age:Int) {
self.name = name
self.age = age
}
func changeName(newName:String){
self.name = newName
}
}
struct text {
var name:String
var age:Int
mutating func changeName(nameone:String) -> () {
self.name = nameone
}
}
注意这里changeName方法,结构体内,如果想自己改变自己,就要加上mutating这个关键字,如果没有这个关键字,就会报错,原因还是两种类型的不同。
类可以继承,而结构体不能继承,这也是一个重要不同。