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

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的区别)