1.Array和ContiguousArray的區(qū)別?
答:Array是值類型,其中裝載的元素也是值類型,再進(jìn)行賦值的傳遞的時(shí)候是值傳遞;ContiguousArray是一個(gè)專門的數(shù)組枷踏,當(dāng)元素是枚舉或者結(jié)構(gòu)體等值類型的時(shí)候掰曾,效率等同Array,但是如果元素是引用類型的時(shí)候旷坦,而且數(shù)組不需要橋接到 NSArray 時(shí),使用 ContiguousArray 替代 Array
2.swift系統(tǒng)函數(shù)比如像
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有什么區(qū)別旗芬?
答:upTo不包括邊界值捆蜀,而from包括辆它,through也包括邊界值
3.slice是什么?
答:文檔說(shuō)slice相當(dāng)于Array的一個(gè)呈現(xiàn)锰茉,使用let修飾一個(gè)slice相當(dāng)于一個(gè)原數(shù)組的一個(gè)部分引用飒筑,注意不應(yīng)該長(zhǎng)時(shí)間保存一個(gè)slice昙衅,因?yàn)閟lice持有的引用不僅僅是呈現(xiàn)出來(lái)的引用定鸟,甚至于原數(shù)組釋放了,slice還會(huì)持有一個(gè)不存在的元素的引用联予,一旦訪問(wèn)將會(huì)是一個(gè)bug或者內(nèi)存泄露沸久。但是var的話就是一個(gè)copy.slice的startIndex起始索引不總是0,在集合及其子序列之間共享索引是重要的部分Swift的集合算法設(shè)計(jì)
4.什么是copy-on-write?
答:在 Swift 中所有的標(biāo)準(zhǔn)庫(kù)容器都使用 COW(copy-on-write) 執(zhí)行拷貝代替即時(shí)拷貝子刮。在很多情況下窑睁,這可以讓編譯器通過(guò)持有容器而不是深度拷貝,從而省掉不必要的拷貝担钮。如果容器的引用計(jì)數(shù)大于 1 并容器時(shí)被改變時(shí)箫津,就會(huì)拷貝底層容器。但是如果兩個(gè)容器是是一樣的苏遥,雖然元素值不會(huì)拷貝,但是系統(tǒng)也為新容器開辟了內(nèi)存
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的區(qū)別师抄?
答:class是引用類型诫肠、struct是值類型栋豫。當(dāng)值類型中游引用類型時(shí)候谚殊,由于引用計(jì)數(shù)的問(wèn)題,性能會(huì)有折扣
6.不通過(guò)繼承嫩絮、代碼復(fù)用(共享的)方式有哪些围肥?
答:代碼封裝穆刻,比如工廠模式杠步;面向協(xié)議編程、以及擴(kuò)展
7.Set獨(dú)有的方法有哪些朵锣?
答:集合是無(wú)序的甸私,他擁有數(shù)學(xué)上的集合特有的交并集合,子集超集
8.map和flatMap區(qū)別皇型?
答:數(shù)組的flatMap除了滿足map以外還犀被,對(duì)嵌套數(shù)組而言flatmap會(huì)自動(dòng)生成一個(gè)一維數(shù)組,此外flatmap還會(huì)過(guò)濾掉空值寡键。但是對(duì)可選值使用map西轩,將會(huì)返回一個(gè)非可選的值,可選值使用flatMap返回一個(gè)可選值藕畔。
9.如何獲取當(dāng)前代碼的函數(shù)名和行號(hào)
答:#fuction和#line分別代表當(dāng)前代碼的函數(shù)名和行號(hào)
10.如何聲明一個(gè)只能被類 conform 的 protocol
答:protocol OnlyClassProtocol : class {}
11.throws 和 rethrows 的用法與作用注服?
答:throws 關(guān)鍵字表示:這個(gè)函數(shù)(閉包)可能拋出異常。而 rethrows 關(guān)鍵字表示:這個(gè)函數(shù)如果拋出異常溶弟,僅可能是因?yàn)閭鬟f給它的閉包的調(diào)用導(dǎo)致了異常.按 Swift 類型安全的寫法辜御,我們就需要使用 try 語(yǔ)法。但是如果很多地方都需要寫 try 的話,會(huì)造成代碼非常啰嗦阁谆。 rethrows 關(guān)鍵字使得一些情況下愉老,如果你傳進(jìn)去的閉包不會(huì)拋出異常,那么你的調(diào)用代碼就不需要寫 try裳凸。
12.associatedtype 的作用
答:協(xié)議中需要使用associatedtype關(guān)鍵字來(lái)表達(dá)泛型參數(shù)化類型
13.什么時(shí)候使用 final劝贸?
答:當(dāng)你想聲明一個(gè)類、一個(gè)方法梦湘、或一個(gè)屬性不想被被重寫使用final件甥。
14.public 和 open 的區(qū)別?
答:public:在Module外只能被訪問(wèn)瓣颅,不能被繼承,在Module內(nèi)部無(wú)限制
open:任何地方都能被訪問(wèn)也可以被被繼承
15.Self 的使用場(chǎng)景
答:在protocol和擴(kuò)展中常見譬正,表示類類型
16.dynamic作用?
答:在 Swift 中粉怕,動(dòng)態(tài)調(diào)度默認(rèn)通過(guò)一個(gè) vtable[1](虛函數(shù)表)間接調(diào)用抒巢。如果使用一個(gè) dynamic 關(guān)鍵字來(lái)聲明,Swift 將會(huì)通過(guò)調(diào)用 Objective-C 通知來(lái)發(fā)送呼叫代替稚晚。這兩種情況中型诚,這種情況會(huì)比直接的函數(shù)調(diào)用較慢,因?yàn)樗乐沽藢?duì)間接呼叫本身之外程序開銷的許多編譯器優(yōu)化[2]幸逆。
17.Error 如果要兼容 NSError 需要做什么操作
答:Error是一個(gè)空協(xié)議暮现,為了兼容原來(lái)的NSError,需要提供一個(gè)新的協(xié)議
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 }
}