009-Swift3.0之类和结构体

一、类和结构体的对比

1.共同点

1)定义属性用于存储值

2)定义方法用于提供功能

3)定义下标操作使得可以通过下标语法来访问实例所包含的值

4)定义构造器用于生成初始化值

5)通过扩展以增加默认实现的功能

6)实现协议以提供某种标准功能

2.与结构体相比,还有如下功能

1)继承允许一个类继承另一个类的特征

2)类型转换允许在运行时检查和解释一个类实例的类型

3)析构器允许一个类实例释放任何其所被分配的资源

4)引用计数允许对一个类的多次引用

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

 

二、语法

类名、结构体名使用大驼峰命名法,属性和方法命名使用小驼峰命名法

class SomeClass {
    //
}
struct SomeStructure {
    // 结构体
}

示例

class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
    func printHello(content: String) {
        print(content)
    }
}
struct Resolution {
    var width = 0
    var height = 0
}

 

三、类和结构体实例

class UserMode {
    var figure = Result()
    var isStudent = true
    var age = 0
    var name: String?
    func printHello(content: String) {
        print(content)
    }
}
struct Result {
    var weight = 0
    var height = 0
}
// 1)生成类和结构体实例
let userModel = UserMode()
let result = Result()
// 2)属性访问
// 通过使用点语法,你可以访问实例的属性
let age = userModel.age
let weight = userModel.figure.weight

 

四、结构体类型的成员逐一构造器

struct Person {
    var name: String
    var sex: String
}
let boy = Person(name: "fuguanlin", sex: "boy")

 

五、值类型&引用类型

1.值类型

结构体个枚举都是值类型

在Swift中,所有的基本类型:整数、浮点数、布尔值、字符串、数组和字典,都是值类型

值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝

struct Animal {
    var name: String
    var sex: String
}
let monkey = Animal(name: "猴子", sex: "")
var cat = monkey    // monkey的值被拷贝一份给cat,当改变cat不会改变monkey
cat.name = "小猫"
cat.sex = ""
print(monkey)  // Animal(name: "猴子", sex: "公")
print(cat)        // Animal(name: "小猫", sex: "母")

2.引用类型

引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝

因此,引用的是已存在的实例本身而不是其拷贝

class Pet {
    var name: String = ""
    var sex: String = ""
}
let cat1 = Pet()
cat1.name = "小喵咪"
cat1.sex = ""
let cat2 = cat1      // 改变cat2的属性值时,cat1的属性值也发生改变,cat1和cat2指向同一片内存空间
cat2.name = "老喵咪"
cat2.sex = ""
print("cat1:\(cat1.name), \(cat1.sex)")     // cat1:老喵咪, 母
print("cat2:\(cat2.name), \(cat2.sex)")   // cat2:老喵咪, 母

3.恒等运算符

对于引用类型来讲,有可能存在对个常量和变量在幕后同时引用同一个类实例

这就类似于C语言中的指针,内存中的一块空间可能存在多个指针同时指向

等价于:===

不等价于:!==

恒等运算符尝尝用来检测两个常量或者变量是否引用同一个实例

注意:“等价于”表示两个类类型的常量或者变量引用同一个类实例,“等于”表示两个实例的值相等

class Rectangle {
    var width: Int = 0
    var height: Int = 0
}
var rectangle1 = Rectangle()
var rectangle2 = rectangle1
if rectangle1 === rectangle2 {
    print("rectangle1和rectangle2同时指向内存空间中同一块内存")
}

 

posted @ 2017-03-24 10:34  Frank9098  阅读(109)  评论(0)    收藏  举报