美文网首页swift面试题
iOS Swift 中Class 和 Struct 的区别(类和

iOS Swift 中Class 和 Struct 的区别(类和

作者: Robinone | 来源:发表于2019-07-22 17:25 被阅读0次
    iOS Swift 中Class 和 Struct 的区别

    在Swift中,Apple是大力提倡结构体的,很多基本的单元都变成了结构体。
    比如Int,在OC中是基本数值类型,在Swift中变成了结构体。

    OC中的基本数据类型NSInteger与Swift中的Int结构体

    1.结构体是值类型,类是引用类型

    Struct is value type while class is reference type

    struct SRound {
        var radius:Int?
    }
    
    let sr1 = SRound(radius: 2)
    var sr2 = SRound()
    sr2.radius = 4
    print("sr1.radius is \(sr1.radius!)\nsr2.radius is \(sr2.radius!)\n")
    
    var sr3 = sr2
    sr2.radius = 100
    print("sr2.radius is \(sr2.radius!)\nsr3.radius is \(sr3.radius!) ")
    

    输出结果为

    sr1.radius is 2
    sr2.radius is 4
    
    sr2.radius is 100
    sr3.radius is 4 
    
    

    将值类型(Value Type)赋值给新的变量时,是值传递的,也就是copy一份给了新变量。
    上例中,sr2结构体中,在sr2赋值给sr3时,sr2.radius 是4,sr3是一份全新的跟sr2一样的struct。
    当sr2被改变时,并不能印象sr3。这也是值传递的本质。

    相反地,class在赋值的时候则是引用传递(类似OC中指针传递)。

    2.Struct(结构体)没有继承特性

    Struct(结构体)没有继承特性

    3.Class需要自己构建constructor

    struct SRound {
        var radius:Int?
        var width:Int
    }
    
    let sr1 = SRound(radius: 2, width: 2) //自动生成的contructor
    
    class CRound {
        var radius:Int?
        init(radius:Int?) { //自己构建的constructor
            self.radius = radius
        }
    }
    
    let cr1 = CRound(radius: 3)
    

    当Struct中有成员不是可选型,该结构体的构建方法就必须包括所有成员参数及全员构造器,该构造器是默认生成的,只有所有成员都为可选型,可直接简单构造,如下:

    struct SRound {
        var radius:Int?
        var width:Int
    }
    
    let sr1 = SRound(radius: 2, width: 2)
    
    struct SRound2 {
        var radius:Int?
        var width:Int?
    }
    
    var sr2 = SRound2()
    sr2.radius = 1
    

    4.Struct改变内容受修饰符let影响,Class不受影响

    let修饰的struct无法被改变,遵循变量修饰符let的通常用法,但let的此效果无法作用到class上

    let对struct和class的影响

    5.Struct方法的mutating修饰符

    当struct方法中需要修改自身property时,方法需要前缀修饰符 mutating


    stuct的mutating修饰符

    修正如下:

    struct SRound {
        var radius:Int?
        var width:Int
    }
    
    extension SRound {
        mutating func changeRadius(radius:Int) {
            self.radius = radius
        }
    }
    
    class CRound {
        var radius:Int?
        init(radius:Int?) {
            self.radius = radius
        }
    }
    
    extension CRound {
        func changeRadius(radius:Int) {
            self.radius = radius
        }
    }
    

    END

    相关文章

      网友评论

        本文标题:iOS Swift 中Class 和 Struct 的区别(类和

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