一、类和结构体
Swift中的类和结构体相同点:
- 都拥有属性,方法
- 都能遵守协议,实现拓展
不同点:
- Class可以继承,struct不能
- class是引用类型,struct是值类型
- class没有默认的
成员逐一构造器
,struct有
枚举:也拥有属性,方法,协议,拓展,和结构体一样是值类型,枚举还拥有关联值等特征
结构体和类最大的区别就是struct
是值类型,class
是引用类型。
所以他们给变量赋值时,class
是增加一个引用,struct
是将对象复制一份给变量(这里涉及到swift的 写时复制技术
)
数据结构 | |
---|---|
值类型 | 结构体、枚举、元组(tuple) 基本类型(Int,Double,Bool等) 集合(Array, String, Dictionary, Set) |
引用类型 | 类(class) 闭包 |
二、元组
元组的简单使用
let ob = (age:22,name:"dsd");
print("age:\(ob.age) name:\(ob.name)");
let ob1 = (22,"dsd");
print("age:\(ob1.0) name:\(ob1.1)");
元组和结构体有点相似,都是一种可以存储不同各类型的的结构
需要临时组合一些相关值的时候,元组非常有用。如果数据结构需要在临时范围之外仍然存在。那就把它抽象成类或者结构体
三、数组
数组的创建
数组的创建有几种形式:
- 指定类型的创建
- 不指定类型(其实是编译器默认类型是
Any
类型)
数组的值由方括号组成,里面的元素用逗号隔开。如果方括号改成了圆括号,编译器不会报错,而是会把它变成元组
var arr3:Array<String> = ["1","23"];
arr3.append("44");
var arr2:[Int] = [1,23];
arr2.append(44);
var arr1 = ["ob",23] as [Any];
arr1.append(("元组",44));
不指定类型创建,可以给数组添加不同类型的元素
题外话:Swift中可以在NSArray与Array之间做无缝的转换
NSArray是类类型,而Array是结构体类型。一个是引用类型,一个是值类型,它们是怎样实现无缝转换的呢?
如果我们自己实现这个功能呢?
那就是遍历,创建一个oc数组,遍历swift的数组,将里面的元素一个一个添加到oc的数组。
在Swift中,Apple已经帮我们完成了大部分的工作。如果需要实现自定义的结构体类型与Objective-C类的切换,则可以让结构体实现_ObjectiveCBridgeable接口。
总结:
通过分析 String 和 Array 我们发现,平时我都知道他们是值类型,但是通过汇编窥探发现,String也有存放在堆空间的情况, Array就是放在堆空间的,这不是和Swift说的 值类型冲突了吗? 并不是这样,底层实现是苹果官方的做法,他把数组设计成引用类型,只限于在底层的实现 , 但是对于我们使用着 String 和 Array的人来说, String 和 Array行为表现官方定义它就是表现为值类型,我们开发者看到String 和 Array ,就知道是值类型,把它当做值类型来用。 见这里