1.Array和ContiguousArray的区别?
答:Array是值类型,其中装载的元素也是值类型,再进行赋值的传递的时候是值传递;ContiguousArray是一个专门的数组,当元素是枚举或者结构体等值类型的时候,效率等同Array,但是如果元素是引用类型的时候,而且数组不需要桥接到 NSArray 时,使用 ContiguousArray 替代 Array
2.swift系统函数比如像
let absences = [0, 2, 0, 4, 0, 3, 1, 0]
let midpoint = absences.count / 2
let firstHalf = absences.prefix(upTo: midpoint)
let secondHalf = absences.suffix(from: midpoint)
这里的upTo和from有什么区别?
答:upTo不包括边界值,而from包括,through也包括边界值
3.slice是什么?
答:文档说slice相当于Array的一个呈现,使用let修饰一个slice相当于一个原数组的一个部分引用,注意不应该长时间保存一个slice,因为slice持有的引用不仅仅是呈现出来的引用,甚至于原数组释放了,slice还会持有一个不存在的元素的引用,一旦访问将会是一个bug或者内存泄露。但是var的话就是一个copy.slice的startIndex起始索引不总是0,在集合及其子序列之间共享索引是重要的部分Swift的集合算法设计
4.什么是copy-on-write?
答:在 Swift 中所有的标准库容器都使用 COW(copy-on-write) 执行拷贝代替即时拷贝。在很多情况下,这可以让编译器通过持有容器而不是深度拷贝,从而省掉不必要的拷贝。如果容器的引用计数大于 1 并容器时被改变时,就会拷贝底层容器。但是如果两个容器是是一样的,虽然元素值不会拷贝,但是系统也为新容器开辟了内存
let titles = ["title1","title2"]
var copyTitles = titles
print(Unmanaged<AnyObject>.passUnretained(titles as AnyObject).toOpaque())
print(Unmanaged<AnyObject>.passUnretained(copyTitles as AnyObject).toOpaque())
//0x0000608000026b60,0x0000600000026e00
5.class和struct的区别?
答:class是引用类型、struct是值类型。当值类型中游引用类型时候,由于引用计数的问题,性能会有折扣
6.不通过继承、代码复用(共享的)方式有哪些?
答:代码封装,比如工厂模式;面向协议编程、以及扩展
7.Set独有的方法有哪些?
答:集合是无序的,他拥有数学上的集合特有的交并集合,子集超集
8.map和flatMap区别?
答:数组的flatMap除了满足map以外还,对嵌套数组而言flatmap会自动生成一个一维数组,此外flatmap还会过滤掉空值。但是对可选值使用map,将会返回一个非可选的值,可选值使用flatMap返回一个可选值。
9.如何获取当前代码的函数名和行号
答:#fuction和#line分别代表当前代码的函数名和行号
10.如何声明一个只能被类 conform 的 protocol
答:protocol OnlyClassProtocol : class {}
11.throws 和 rethrows 的用法与作用?
答:throws 关键字表示:这个函数(闭包)可能抛出异常。而 rethrows 关键字表示:这个函数如果抛出异常,仅可能是因为传递给它的闭包的调用导致了异常.按 Swift 类型安全的写法,我们就需要使用 try 语法。但是如果很多地方都需要写 try 的话,会造成代码非常啰嗦。 rethrows 关键字使得一些情况下,如果你传进去的闭包不会抛出异常,那么你的调用代码就不需要写 try。
12.associatedtype 的作用
答:协议中需要使用associatedtype关键字来表达泛型参数化类型
13.什么时候使用 final?
答:当你想声明一个类、一个方法、或一个属性不想被被重写使用final。
14.public 和 open 的区别?
答:public:在Module外只能被访问,不能被继承,在Module内部无限制
open:任何地方都能被访问也可以被被继承
15.Self 的使用场景
答:在protocol和扩展中常见,表示类类型
16.dynamic作用?
答:在 Swift 中,动态调度默认通过一个 vtable[1](虚函数表)间接调用。如果使用一个 dynamic 关键字来声明,Swift 将会通过调用 Objective-C 通知来发送呼叫代替。这两种情况中,这种情况会比直接的函数调用较慢,因为它防止了对间接呼叫本身之外程序开销的许多编译器优化[2]。
17.Error 如果要兼容 NSError 需要做什么操作
答:Error是一个空协议,为了兼容原来的NSError,需要提供一个新的协议
public protocol CustomNSError : Error {
/// The domain of the error.
public static var errorDomain: String { get }
/// The error code within the given domain.
public var errorCode: Int { get }
/// The user-info dictionary.
public var errorUserInfo: [String : Any] { get }
}