(十七)[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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,807评论 0 9
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,144评论 1 51
  • #闭包(Closures) 本页包含内容: - 闭包表达式(Closure Expressions) - 尾随闭包...
    刺骨寒阅读 5,005评论 0 0
  • 阳春三月,风和日丽,春暖花开。 我抖落身上的尘土,在雨露中浣洗铅华,小心翼翼地把潮湿的心事挂在枝头晾晒。清风把心事...
    魚非乐阅读 4,256评论 0 4
  • 原创2017年5月5日王梓 喜欢一个人的旅行,一个人吃饭远足,一个人到处走走停停,一个人的自由欢愉。 一个人离家求...
    遇见云妮阅读 3,101评论 19 19