swift面试题

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

2019-07-22  本文已影响0人  Robinone
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

上一篇下一篇

猜你喜欢

热点阅读