1.swift中结构体和类的对比(相同和区别
)
1.相同点:
- 定义属性用于存储值
- 定义方法用于提供功能
- 定义下标操作用于通过下标语法访问它们的值
- 定义构造器用于设置初始值
- 通过扩展以增加默认实现之外的功能
- 遵循协议以提供某种标准功能
2.区别
- 类有继承的特性,而结构体没有
- 类型转换使您能够在运行时检查和解释类实例的类型
- 类有析构函数用来释放其分配的资源
- 引用计数允许对一个类实例有多个引用
3.内存上的区别
- 1.类是
引用类型
,是一个类类型的变量存储的是当前实例内存地址的引用 - 2.结构体是一个典型的
值类型
,是存储的具体的实例,可以理解成具体的值 - 3
总结:本质区别
- 类是引用类型、结构体是值类型
- 2.存储位置不同:值类型存储在栈上,引用类型存储在堆上
swift类和结构体的对比CSDN
2.存储属性和计算属性的区别
- 存储属性用来进行数据的存储,
需要分配内存空间
. - 计算属性用来定义计算的过程,
不需要分配空间
.
3.static和class的区别
- a.static可以修饰属性和方法,但是
修饰的属性和方法不能被重写
。修饰的方法叫静态方法
<===>(class
可以修饰计算属性和方法
,但是不能修饰存储属性
) - b.
static
可以在类、结构体、枚举中使用.修饰的方法叫类方法
,可以被重写
- c.
class
只能在类中使用
扩展:
oc中的static
可以修饰全局变量和局部变量
4.Swift
是面向对象还是函数式的编程语言?
回答:Swift 既是面向对象的,又是函数式的编程语言。
- (1).说 Swift 是面向对象的语言,是因为 Swift 支持
类的封装、继承、和多态
,从这点上来看与 Java 这类纯面向对象的语言几乎毫无差别。 - (2).说 Swift 是函数式编程语言,是因为
Swift 支持 map, reduce, filter, flatmap 这类去除中间状态、数学函数式的方法
,更加强调运算结果
而不是中间过程
5.比较以下关键词:Open, Public, Internal, File-private, Private
- Swift 有五个级别的访问控制权限,从高到底依次为比如 Open, Public, Internal, File-private, Private
- 遵循的基本原则是:
高级别的变量不允许被定义为低级别变量的成员变量
对比.png
6.strong, weak, unowned
关键字的对比
- strong 代表着强引用,是
默认属性
。当一个对象被声明为 strong 时,就表示父层级对该对象有一个强引用的指向。此时该对象的引用计数会增加1。 - weak 代表着弱引用。该对象的引用计数不会增加1。
它在对象释放后弱引用也随即消失。
继续访问该对象,程序会得到 nil,不会崩溃 - unowned 与弱引用本质上一样。唯一不同的是,
对象在释放后,依然有一个无效的引用指向对象,它不是 Optional 也不指向 nil。
如果继续访问该对象,程序就会崩溃。
加分回答:
- weak 和 unowned 的引入是为了解决由
strong 带来的循环引用问题
- weak 和 unowned 的使用场景有如下差别:
- 当访问对象时该对象可能已经被释放了,则用 weak。比如
delegate
的修饰 - 当访问对象确定不可能被释放,则用 unowned。比如
self 的引用
- 为了
安全起见
,很多公司规定任何时候都使用 weak 去修饰.
- 当访问对象时该对象可能已经被释放了,则用 weak。比如
- Swift为什么将
String,Array,Dictionary
设计成值类型?
oc中的String,Array,Dictionary是引用类型.
- 值类型相比引用类型,最大的优势在于
内存使用的高效.
值类型在栈上操作
,引用类型在堆上操作。
栈上的操作仅仅是单个指针的上下移动,而堆上的操作则牵涉到合并、移位、重新链接等 -
为了线程安全考虑。
通过Swift的let设置,使得这些数据达到了真正意义上的“不变”,它也从根本上解决了多线程中内存访问和操作顺序的问题。 -
设计成值类型还可以提升API的灵活度
。例如通过实现Collection这样的协议,我们可以遍历String,使得整个开发更加灵活高效。