引用类型
传递的是对象的指针,这些指针保存在栈(Stack)上,栈中的对象系统会自动为我们管理(ARC),这样我们就不用自己去开辟和释放
内存空间了,一旦没有指针指向对象,那么对象就会马上被清理掉,这种机制叫做自动引用计数(ARC)。
这些对象存储在(Heap)堆中
类(Class)是引用类型
定义类使用class 关键字
class newClass {
// 创建了一个新类
}
唯一具有继承属性
可以定义构造方法
值类型
可以定义构造方法
传递存储的是复制后的值
这些对象直接存储在栈(Stack)上
变长的结构体和枚举需要堆内存的配合,栈的空间有限,运行速度更快。
写时拷贝(copy-on-Write)
当使用方法修改内部属性时,必须在方法前加上关键字 “mutating”
mutating (变异方法)
1.只能用于值类型,如结构体和枚举
2.因为要改变自己,所以要定义为变量类型(var),而不能是常量类型(let)
在属性类型明确的情况下,一个值类型的长度是固定的,常数长度的复制时间成本是O(1)
结构体(Structure)是值类型
使用struct关键字声明一个结构体
struct newStruct {
// 创建了一个结构体
}
Swift中基础数据类型都是结构体,无论是整数,浮点数,还是数组和字典。范围(Range)也是一个结构体
范围的定义也是泛型的,一个数组的范围就是Range<Int>,一个字符串的范围就是Range<String.Index>
枚举(Enumeration)是值类型
使用enum关键字定义枚举。枚举的属性只能是计算属性
当某样东西在一种情况下是一个值,在另一种情况下是另一个值,但是不可能同时拥有这两个值的时候,使用枚举是非常合适的。
enum newEnum {
// 创建了一个枚举
}
一个惊人的事实是:我们之前接触的可选类型也是一个枚举!它是一个非常简单的枚举,同时它还是一个泛型。定义如下:
enum Optional<T> {
case None
case Some(T)
}
可选类型解包
var showStr = str!
解包操作其实是一个Switch操作,上面的代码等同于
switch str {
case Some(let value):showStr = value
case None: //发生异常
}
enum Turn {
case left
case right
var reminder: String {
//枚举内部访问 case
switch self {
case .left:
return "左转"
case .right:
return "右转"
}
}
}
let turn = Turn.left
print(turn.reminder)