乐趣区

swift的一些面试题

一、open 与 public 的区别

  • public:可以别任何人访问,但是不可以被其他 module 复写和继承。
  • open:可以被任何人访问,可以被继承和复写。

二、struct 与 class 的区别

  • struct 是 值类型 ,class 是 引用类型

    • 值类型 的变量直接包含它们的数据,对于值类型都有它们自己的数据副本,因此对一个变量操作不可能影响另一个变量。
    • 引用类型 的变量存储对他们的数据引用,因此后者称为对象,因此对一个变量操作可能影响另一个变量所引用的对象。
    • 二者的本质区别:struct 是深拷贝,拷贝的是内容;class 是浅拷贝,拷贝的是指针
  • property 的初始化不同:class 在初始化时不能直接把 property 放在 默认的 constructor 的参数里,而是需要自己创建一个带参数的 constructor;而 struct 可以,把属性放在默认的 constructor 的参数里。
  • 变量赋值方式不同:struct 是值拷贝;class 是引用拷贝。
  • immutable 变量:swift 的可变内容和不可变内容用 var 和 let 来甄别,如果初始为 let 的变量再去修改会发生编译错误。struct 遵循这一特性;class 不存在这样的问题
  • mutating function:struct 和 class 的差別是 struct 的 function 要去改变 property 的值的时候要加上 mutating,而 class 不用。
  • 继承:struct 不可以继承,class 可以继承。
  • struct 比 class 更轻量:struct 分配在栈中,class 分配在堆中。

三、swift 把 struct 作为数据模型

3.1 优点

  1. 安全性:因为 Struct 是用值类型传递的,它们没有引用计数。
  2. 内存:由于他们没有引用数,他们不会因为循环引用导致内存泄漏。
  3. 速度:值类型通常来说是以栈的形式分配的,而不是用堆。因此他们比 Class 要快很多!
  4. 拷贝:Objective-C 里拷贝一个对象, 你必须选用正确的拷贝类型(深拷贝、浅拷贝), 而值类型的拷贝则非常轻松!
  5. 线程安全:值类型是自动线程安全的。无论你从哪个线程去访问你的 Struct,都非常简单。

3.2 缺点

  1. Objective- C 与 swift 混合开发:OC 调用的 swift 代码必须继承于 NSObject。
  2. 继承:struct 不能相互继承。
  3. NSUserDefaults:Struct 不能被序列化成 NSData 对象。

参考文章

Swift 浅谈 Struct 与 Class

退出移动版