Swift 3 结构体和类的不同

2017-05-08  本文已影响28人  revon

结构体是值类型,类是引用类型(值类型赋值就是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这个关键字,如果没有这个关键字,就会报错,原因还是两种类型的不同。

类可以继承,而结构体不能继承,这也是一个重要不同。

上一篇下一篇

猜你喜欢

热点阅读