美文网首页Swift
(十七)[Swift]Swift中Class 与Struct的区

(十七)[Swift]Swift中Class 与Struct的区

作者: 修行猿 | 来源:发表于2016-08-13 09:45 被阅读86次

    1.初始化方法的不同

    Struct会有一个默认的初始化函数

    struct Point {
        var x :Int
        var y : Int
    }
    

    Class不同,必须手动实现一个初始化函数

    //报错
    //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  //报错
    p2.x = 2  //不会报错
    //p2 = p3    //报错
    
    
    

    3.Swift为Class提供了一个指针判断的操作符 ===

    判断两个指针是否指向相同的对象

    p2 === p3
    p2 === p4
    

    4.Struct和Class在函数声明上的不同

    Struct在函数中修改自己本身的值需要加上mutating关键字

    struct Point {
        var x :Int
        var y : Int
        //报错
    //    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.赋值语义上的区别

    间接修改属性的值,struct并不会影响原始数据本身,因为Struct是值类型,每次赋值都是一次值拷贝

    var p5 = p2
    p5.x = 10
    p2.x   //10
    

    而class不同,每一次赋值都是只赋值指针本身,而不是重新创建一个新的内存区域

    var p6 = p
    p6.x = 10
    p.x  //1
    

    相关文章

      网友评论

        本文标题:(十七)[Swift]Swift中Class 与Struct的区

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