美文网首页
Swift 3 结构体和类的不同

Swift 3 结构体和类的不同

作者: revon | 来源:发表于2017-05-08 15:05 被阅读28次

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

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

    相关文章

      网友评论

          本文标题:Swift 3 结构体和类的不同

          本文链接:https://www.haomeiwen.com/subject/fewmtxtx.html