数据结构:类、结构体、枚举

引用类型

传递的是对象的指针,这些指针保存在栈(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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值