iOS——Swift面试题大全

959 阅读3分钟

OC和Swift的区别

  1. Swift更加安全,它是类型安全的语言,有类型推断,OC是动态语言
  2. Swift注重值类型,OC注重引用类型。
  3. Swift支持泛型
  4. Swift支持静态派发,动态派发(函数表派发、消息派发)方式,OC支持动态派发(消息派发方式)
  5. swift支持命名空间
  6. swift支持默认参数
  7. swift比oc代码更加简洁

Swift -Struct 与Class的区别

  1. 在Swift中类和结构体,都可以定义属性、方法、下标和初始化器。 struct 没有析构方法
  2. struct是值类型,class是引用类型, struc是存储在栈上,class是存储在堆上。
  3. class可以继承, 而struct不可以继承
  4. struct在func里面需要修改属性的时候需要加上 mutating 关键字,class就不用。

在Swift扩展里添加存储属性

在 Swift 的 Extension 里是不能添加存储属性的,这里可以类比 Objective-C的 Category 分类,分类是不能添加实例变量和属性的。

不管是 Swift 的 Extension 还是 Objective-C 的 Category 都不能改变原有的类或者结构体的内存结构,在实例化这些类的时候,内存结构是确定的,而添加属性或者实例变量需要内存空间,会改变原有的内存结构。

可以利用关联对象在 Extension 中添加计算属性,以达到所谓的存储属性的效果。


Swift关键字final

  • final 用于限制继承和重写. 如果只是需要在某一个属性前加一个 final.
  • 如果需要限制整个类无法被继承, 那么可以在类名之前加一个final

Swift中public和open的区别

这两个都用于在模块中声明需要对外界暴露的函数, 区别在于,

  • public修饰的类在模块外无法继承,
  • 而open则可以任意继承,
  • 公开度来说, open > public

Swift 为什么将 Array,String,Dictionary,Set,设计为值类型?

值类型 相比 引用类型的优点

  • 值类型和引用类型相比,最大优势可以高效的使用内存;
  • 值类型在栈上操作,引用类型在堆上操作;
  • 栈上操作仅仅是单个指针的移动,
  • 堆上操作牵涉到合并,位移,重链接

Swift 这样设计减少了堆上内存分配和回收次数,使用 copy-on-write将值传递与复制开销降到最低。

String,Array,Dictionary设计成值类型,也是为了线程安全考虑。通过Swift的let设置,使得这些数据达到了真正意义上的“不变”,它也从根本上解决了多线程中内存访问和操作顺序的问题


Swift中的static或者class修饰符的作用

在struct中声明一个静态属性或者函数,使用static 修饰符

struct Test{
    static func text(){
        
    }
}

在Class类中使用static或者class修饰符, 都是可以的. 他们使用后的效果是一样, 但是本质上是不同的.

  • 本质不同原因是: static修饰的属性或者修饰的函数都不可以重写. 但是使用class修饰符, 可以重写.计算属性需要使用static
  • static在类中应用的时候, static就成为class final的一个别名.

如何理解copy-on-write?

值类型(比如:struct),在复制时,复制对象与原对象实际上在内存中指向同一个对象,当且仅当修改复制的对象时,才会在内存中创建一个新的对象,

  • 为了提升性能,Struct, String、Array、Dictionary、Set采取了Copy On Write的技术
  • 比如仅当有“写”操作时,才会真正执行拷贝操作
  • 对于标准库值类型的赋值操作,Swift 能确保最佳性能,所有没必要为了保证最佳性能来避免赋值