swift 类和结构体

2018-11-29  本文已影响0人  皆为序幕_

定义

class Student: NSObject {
    var name = ""
    var age = 0
}

struct Teacher {
    var name = ""
    var age = 0
}
let student = Student()
let teacher = Teacher()
let ter = Teacher(name: "teacher", age: 30)
student.name = "student"
teacher.name = "teacher"
print(student.name)
print(teacher.name)

结构体是值类型

值类型被赋予给一个变量、常量或被传递给一个函数的时,其值会被拷贝(在 Swift 中,所有的基本类型:整数、浮点数、布尔值、字符串、数组和字典,都是值类型

struct Teacher {
    var name = ""
    var age = 0
}

let ter = Teacher(name: "teacher", age: 30)

//因为Teacher是一个结构体,所以ter1的值其实是ter的一个拷贝副本,而不是ter本身。尽管ter和ter1有着相同的name和age,但其实它们是两个完全不同的实例
var ter1 = ter

ter1.name = "good teacher"

//通过log证明ter和ter1其中任何一个修改都不会影响另一个
print(ter.name)    //teacher
print(ter1.name)  //good teacher

类是引用类型

引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝

class Student: NSObject {
    var name = ""
    var age = 0
}

let stu = Student()
stu.name = "good student"

//因为类是引用类型,所以stu1和stu实际上引用的是相同的Student实例
let stu1 = stu

stu1.name = "bad student"

print(stu.name)
print(stu1.name)

注意: stustu1被声明为常量而不是变量。但是,依然可以改变stu.namestu1.name,因为stustu1这两个常量的值并未改变。它们并不存储这个Student实例,而是指向Student的实例。所以,改变的是被引用的VideoModename属性,而不是引用VideoMode的常量的值


类和结构体对比

Swift 中类和结构体有很多共同点

与结构体相比,类还有如下的附加功能

注意

结构体总是通过被复制的方式在代码中传递,不使用引用计数

上一篇 下一篇

猜你喜欢

热点阅读