Swift面试题

434 阅读2分钟
  1. 什么是值类型的copy-on-write
  • 只有Array和Collections默认是使用写时复制
  • 在变量赋值时没有发生深拷贝,在改变集合里的元素时才会发生拷贝
  • 基本上,它是一个包装器,负责管理引用类型,如果该值没有被唯一引用,它只返回一个新实例。 否则,它只是变异了引用类型的值。

//为了尽量减少这个问题,Swift  
//标准库为一些值类型实现了这一组机制,比如 Array,  
//其中的值只有在变异时才会被复制,即使如此,也只有在它有多个对它的引用时才会被复制,  
//因为如果这个值是唯一引用的,它不需要复制,它只是在引用上发生变异。  
//所以,仅仅赋值给一个变量或者传递一个数组给一个函数并不一定意味着它会被复制,而这确实提高了性能。


var array1: [Int] = [0, 1, 2, 3]
var array2 = array1

//Print with just assign
print(address: array1) //0x600000078de0
print(address: array2) //0x600000078de0
//Let's mutate array2 to see what's
array2.append(4)

print(address: array2) //0x6000000aa100
  • 原理
final class Ref<T> {
  var val : T
  init(_ v : T) {val = v}
}

struct Box<T> {
    var ref : Ref<T>
    init(_ x : T) { ref = Ref(x) }

    var value: T {
        get { return ref.val }
        set {
          if (!isUniquelyReferencedNonObjC(&ref)) {
            ref = Ref(newValue)
            return
          }
          ref.val = newValue
        }
    }
}
// This code was an example taken from the swift repo doc file OptimizationTips 
// Link: https://github.com/apple/swift/blob/master/docs/OptimizationTips.rst#advice-use-copy-on-write-semantics-for-large-values
  1. swift和oc区别
  • 官方文档描述:更快,更安全,更富有变现力
  • 特性:
    1. 使用函数指针统一闭包
    2. 元组和多个返回值
    3. 泛型
    4. 对一个范围或集合进行快速和简洁的迭代
    5. 结构体它们支持方法、扩展和协议
    6. 函数式编程模式,例如,map 和 filter
    7. 内置的强大错误处理 1.高级控制流do, guard, defer, and ,及repeat keywords 关键字
  • 安全:
    可选值。Optional
  1. Optional实现原理
    Swift通过枚举实现Optional, 通过ExpressibleByNilLiteral协议,简化Optional写法
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)

    public init(_ some: Wrapped)
    public func map(_ transform: (Wrapped) throws -> U) rethrows -> U?
    public func flatMap(_ transform: (Wrapped) throws -> U?) rethrows -> U?
    public init(nilLiteral: ())
    public var unsafelyUnwrapped: Wrapped { get }
}

var a: Optioanl<Int> = .some(1)
a = .none

var a: Int? = 1
a = nil

参考资料

Understanding Swift Copy-on-Write mechanisms
What is copy on write?
实用的可选项(Optional)扩展