http://www.itdecent.cn/p/39f6c488708e
oc分類和swift擴(kuò)展有哪些區(qū)別
https://blog.csdn.net/weixin_38633659/article/details/149299484?spm=1001.2014.3001.5502
1.Swift 與 Objective-C 的聯(lián)系與區(qū)別?
Swift和Objective-C共用一套運行時環(huán)境,Swift的類型可以橋接到Objective-C,反之亦然。兩者可以互相引用混合編程。此外,Objective-C中積累的許多類庫在Swift中大部分仍然可以直接使用。
- 語法風(fēng)格:Objective-C的語法風(fēng)格受到C語言的影響,使用方括號([ ])來調(diào)用方法。而Swift則采用了更現(xiàn)代化的語法風(fēng)格,更加簡潔易讀,更接近自然語言的表達(dá)方式。
- 類型安全:Swift是一門類型安全的語言,鼓勵程序員在代碼中明確值的類型。而Objective-C則不然,聲明了字符串類型仍然可以傳遞NSNumber類型給它。
- 內(nèi)存管理:Swift的內(nèi)存管理更自動化,而Objective-C需要手動管理內(nèi)存,使用[ARC]"ARC")(自動引用計數(shù))來簡化這一過程。
- 新特性:Swift支持泛型、元組等新特性,而Objective-C中沒有這些特性。
- 學(xué)習(xí)難度:Swift的入手難度較低,而Objective-C由于語法較為繁瑣,對初學(xué)者不太友好。
"Swift")的優(yōu)勢**:
- 易讀性和易維護(hù)性:Swift的語法簡潔,文件結(jié)構(gòu)清晰,易于閱讀和維護(hù)。
- 安全性:Swift是類型安全的語言,可以在編譯時檢查類型錯誤。
- 高效性:Swift的運算性能較高,代碼更少且效率更高。
[Swift] "Swift")的缺點:
- 社區(qū)和開源項目:目前使用人數(shù)比例較低,社區(qū)的開源項目也較少。
- 兼容性問題:對于不支持Swift的第三方類庫,需要進(jìn)行混合編程,利用橋接文件實現(xiàn)
2.Swift 比 Objective-C 有什么優(yōu)勢?
更強的類型安全和錯誤處理機(jī)制:Swift是一種靜態(tài)類型語言,編譯器可以在編譯時檢查類型錯誤和其他常見的編程錯誤,從而減少運行時錯誤,提高應(yīng)用程序的穩(wěn)定性和安全性。相比之下,Objective-C是動態(tài)類型語言,類型檢查主要在運行時進(jìn)行,容易導(dǎo)致運行時錯誤。
更簡潔的語法:Swift的語法更加簡潔,易于閱讀和編寫,這可以提高研發(fā)效率。Objective-C的語法相對冗長和復(fù)雜。
更好的性能:Swift的性能通常比Objective-C更好,尤其是在處理大量數(shù)據(jù)時。Swift采用了一些現(xiàn)代編程語言的特性,如自動引用計數(shù)和結(jié)構(gòu)體,以提高性能。
更強的特性支持:Swift具有許多Objective-C所不具備的特性,如結(jié)構(gòu)體、泛型和函數(shù)式編程等。這些特性可以幫助開發(fā)人員更好地組織和管理代碼,提高應(yīng)用程序的可重用性和可維護(hù)性。
更好的互操作性:Swift兼容Objective-C,可以在同一個項目中同時使用兩種語言編寫代碼,并且可以無縫調(diào)用Objective-C的代碼。這意味著可以逐步遷移項目,同時使用兩種語言編寫的代碼。
詳細(xì)解釋這些優(yōu)勢:
類型安全和錯誤處理機(jī)制:Swift的靜態(tài)類型系統(tǒng)要求所有變量的類型在編譯時就已經(jīng)確定,編譯器在編譯階段進(jìn)行類型檢查,能夠更早地發(fā)現(xiàn)類型錯誤,從而避免運行時錯誤,提高代碼的安全性和可靠性。相比之下,Objective-C由于其動態(tài)特性,類型檢查主要在運行時進(jìn)行,容易導(dǎo)致運行時錯誤。
語法簡潔性:Swift的語法設(shè)計更加簡潔和易讀,例如不需要行尾的分號,方法和函數(shù)的調(diào)用使用標(biāo)準(zhǔn)的括號內(nèi)逗號分隔的參數(shù)列表,這使得代碼更加干凈和有表現(xiàn)力。相比之下,Objective-C的語法相對復(fù)雜。
性能優(yōu)勢:Swift的性能通常比Objective-C更好,這得益于其靜態(tài)類型和編譯時優(yōu)化。Swift支持內(nèi)聯(lián)函數(shù)和高級編譯器優(yōu)化,可以進(jìn)一步提高應(yīng)用程序的性能。相比之下,Objective-C作為動態(tài)語言,需要在運行時進(jìn)行類型檢查和消息傳遞,這些操作會導(dǎo)致額外的開銷,影響性能。
特性支持:Swift支持許多現(xiàn)代編程特性,如結(jié)構(gòu)體、泛型和函數(shù)式編程等,這些特性可以幫助開發(fā)人員更好地組織和管理代碼,提高代碼的質(zhì)量和性能。相比之下,Objective-C在這些方面的支持較弱。
互操作性:Swift兼容Objective-C,可以在同一個項目中同時使用兩種語言編寫代碼,并且可以無縫調(diào)用Objective-C的代碼。這意味著可以逐步遷移項目,同時使用兩種語言編寫的代碼,提高了開發(fā)的靈活性和效率。
3.Swift目前存在的缺點
1.學(xué)習(xí)曲線:雖然 Swift 的語法相對簡單直觀,但它提供了許多特性(例如泛型、閉包),這使得完全理解和掌握 Swift 需要一定時間。
2.兼容性問題:Swift 在發(fā)布后不斷發(fā)展,新版本可能會引入不兼容的更改,這可能需要開發(fā)者花時間去適配他們的代碼。
3.性能問題:雖然 Swift 旨在提供高性能,但在某些特定的情況下,與 Objective-C 或 C++ 編寫的代碼相比,Swift 程序可能不會有最優(yōu)化的性能。
4.第三方庫支持:雖然 Swift 在移動端開發(fā)中取得了廣泛的應(yīng)用,但在服務(wù)器端或桌面應(yīng)用開發(fā)中,可用的第三方庫可能不如 Objective-C 或 C++ 那么豐富。
5.工具鏈限制:Swift 的開發(fā)和發(fā)布受限于蘋果的 SDK,這可能限制了其在某些平臺的應(yīng)用。
6.安全性問題:Swift 引入了一些新的安全特性,如自動引用計數(shù)(ARC)和過程調(diào)用安全(Parameter calls),但這些特性可能導(dǎo)致開發(fā)者在處理內(nèi)存管理時出現(xiàn)困難。
針對這些問題,解決方案可能包括:
通過不斷學(xué)習(xí)和實踐來掌握 Swift 的復(fù)雜特性。
關(guān)注 Swift 的發(fā)展,并在必要時對代碼進(jìn)行重構(gòu)以適應(yīng)新版本。
對于性能問題,可以使用 Swift 性能優(yōu)化工具,并考慮使用 C 代碼擴(kuò)展等方法。
尋找或貢獻(xiàn)更多的第三方庫來補充 Swift 在特定領(lǐng)域的不足。
保持對新的開發(fā)工具和環(huán)境的關(guān)注,如果需要,可以使用其他支持 Swift 的工具鏈。
在安全性問題上,進(jìn)行代碼審查,使用靜態(tài)分析工具,并遵循最佳實踐以提高代碼安全性。
由于這些問題都有相應(yīng)的解決策略,具體到實踐中,開發(fā)者可以根據(jù)具體需求和上下文來應(yīng)對。
4.Swift 相比 Objective-C 獨有的語法
1.可選項(Optionals): Swift 的可選項用于處理變量可能不存在的情況,而不是像 Objective-C 那樣使用指針。
var optionalString: String? = "Hello, Swift!"
2.強制解包(Forced Unwrapping): 可以通過在變量后面加上感嘆號(!)來強制解包可選項。
print(optionalString!) // 如果optionalString為nil,這會導(dǎo)致運行時錯誤
可選綁定(Optional Binding): 可以檢查并且綁定可選值,在檢查的同時賦值給一個臨時常量或變量。
if let string = optionalString {
print(string)
}
3.泛型(Generics): Swift 支持泛型編程,允許定義可以用于多種類型的函數(shù)或容器。
func swap<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
4.類型推斷(Type Inference): Swift 可以自動推斷變量的類型,不需要像 Objective-C 那樣顯式指定類型。
let inferredType = "Hello, Swift!"
5.結(jié)構(gòu)體(Structs): Swift 的結(jié)構(gòu)體是值類型,可以更高效地創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu),并且有更多的語法糖。
struct Point {
var x: Int
var y: Int
}
6.擴(kuò)展(Extensions): Swift 允許你給現(xiàn)有的類型添加新的功能,甚至可以擴(kuò)展它的原始實現(xiàn)。
extension Int {
func repeatMe() -> Int {
return self * 2
}
}
7.協(xié)議(Protocols): Swift 的協(xié)議比 Objective-C 的委托更強大,它可以定義方法、屬性、下標(biāo)訪問,并且可以有默認(rèn)實現(xiàn)。
protocol ExampleProtocol {
var property: Int { get set }
func method()
}
8.自動引用計數(shù)(Automatic Reference Counting, ARC): Swift 使用 ARC 自動管理內(nèi)存,避免了許多常見的內(nèi)存泄漏問題。
錯誤處理(Error Handling): Swift 提供了強大而優(yōu)雅的錯誤處理機(jī)制,包括可以拋出和捕獲錯誤的能力。
enum PrinterError: Error {
case outOfPaper
case noToner
case onFire
}
func send(job: Int, toPrinter printerName: String) throws {
if printerName == "Never Has Toner" {
throw PrinterError.noToner
}
// 發(fā)送打印任務(wù)的代碼
}
這些是 Swift 相較 Objective-C 獨有的一些語法特性。每一項都可以展開討論,因為它們各自都有著重要的應(yīng)用場景和教育意義。
5.Swift 相比 Objective-C 細(xì)節(jié)使用區(qū)別
1.類型安全 (Type Safety)
Swift 是類型安全的語言,這意味著它要求你在進(jìn)行操作之前明確指定數(shù)據(jù)的類型。Objective-C 不是類型安全的,它可以在運行時通過id類型進(jìn)行隱式類型轉(zhuǎn)換。
2.可選項 (Optionals)
Swift 引入了可選項的概念,用于處理變量可能不存在的情況。Objective-C 通常使用指針和nil來處理可能為空的對象。
3.屬性 (Properties)
Swift 使用屬性來自動管理存儲行為,而 Objective-C 需要手動管理內(nèi)存。
4.構(gòu)造器 (Initializers)
Swift 提供了自定義構(gòu)造器,并且可以選擇是否要指定構(gòu)造器。Objective-C 需要使用init方法,并且不能有選擇地初始化屬性。
5.擴(kuò)展 (Extensions)
Swift 允許你擴(kuò)展現(xiàn)有類型添加新的功能,而 Objective-C 不支持這一點。
6.協(xié)議 (Protocols)
Swift 的協(xié)議是一種類型,可以有默認(rèn)實現(xiàn)和擴(kuò)展。Objective-C 的協(xié)議不是類型,不能有默認(rèn)實現(xiàn)或擴(kuò)展。
7.錯誤處理 (Error Handling)
Swift 引入了錯誤處理機(jī)制,而 Objective-C 需要使用NSError對象作為參數(shù)傳遞錯誤信息。
8.自動引用計數(shù) (Automatic Reference Counting, ARC)
Swift 使用ARC來自動管理內(nèi)存,而 Objective-C 需要手動管理內(nèi)存。
9.內(nèi)存管理 (Memory Management)
Swift 使用自動引用計數(shù) (ARC) 來管理內(nèi)存,而 Objective-C 需要開發(fā)者手動管理內(nèi)存(使用引用計數(shù)、自動釋放池等)。
10.斷言和預(yù)處理器 (Assertions and Preprocessor Directives)
Swift 使用assert函數(shù)和預(yù)處理器指令來控制調(diào)試信息,而 Objective-C 使用NSAssert宏。
這些是Swift和Objective-C之間主要的不同點。當(dāng)然,兩者都有其優(yōu)點和適用場景,開發(fā)者可以根據(jù)項目需求選擇合適的語言。
6.Swift 是面向?qū)ο筮€是函數(shù)式的編程語言?
Swift 是一種混合型的編程語言,它既有面向?qū)ο缶幊痰奶卣?,也支持函?shù)式編程的概念。它是靜態(tài)類型的語言,同時支持協(xié)程和泛型等高級特性。
面向?qū)ο蟮奶卣鳎?br>
類和對象
繼承和多態(tài)
訪問控制(如:private, internal, public)
函數(shù)式編程特征:
閉包和高階函數(shù)
map, filter, reduce 等函數(shù)式編程范式的函數(shù)
內(nèi)置協(xié)程和泛型支持
Swift 混合了面向?qū)ο蠛秃瘮?shù)式編程的特性,這使得它在開發(fā)現(xiàn)代應(yīng)用時提供了靈活性和表達(dá)力。
7.請說明并比較以下關(guān)鍵詞:Open, Public, Internal, File-private, Private
在Swift編程語言中,訪問級別修飾符指定了代碼在不同的模塊(例如:源文件、庫、框架)內(nèi)部或者外部的訪問權(quán)限。以下是Swift語言中的五種訪問級別:
open:允許在定義模塊外部的任何代碼訪問,也就是說,這個成員可以被任何繼承了定義模塊的子類訪問。
public:允許在定義模塊外部的任何代碼訪問,但是不允許在定義模塊內(nèi)部的任何子類訪問。
internal:允許在定義模塊內(nèi)部的任何代碼訪問,但是不允許在定義模塊外部的任何代碼訪問。
fileprivate:只允許在定義的那個源文件內(nèi)部訪問,不允許在其他源文件中訪問,甚至不允許在同一個源文件中的其他類訪問。
private:只允許在定義它的那個作用域內(nèi)訪問,不允許在其他任何地方訪問。
以下是一些使用這些關(guān)鍵字的示例代碼:
// 使用 internal 關(guān)鍵字
internal var myInternalVar = "Hello, World!"
// 使用 fileprivate 關(guān)鍵字
fileprivate func myFilePrivateFunction() {
print("This is a file-private function.")
}
// 使用 private 關(guān)鍵字
private let myPrivateConstant = "I am private!"
// 使用 public 關(guān)鍵字
public class MyClass {
public var myPublicVar = "Hello, Swift!"
public func myPublicFunction() {
print("This is a public function.")
}
}
// 使用 open 關(guān)鍵字
open class MyOpenClass {
open func myOpenFunction() {
print("This is an open function.")
}
}
在選擇使用哪種訪問級別時,應(yīng)考慮以下原則:
如果你想讓你的實體(例如類、方法、變量等)對定義模塊的外部可用,使用 public。
如果你想讓你的實體僅在定義模塊內(nèi)部可用,使用 internal。
如果你想讓你的實體僅在一個源文件內(nèi)部可用,使用 fileprivate。
如果你想讓你的實體僅在一個特定的作用域內(nèi)可用,使用 private。
如果你想讓你的類或者類的成員在定義模塊的子類中可用,使用 open。
8.請說明并比較以下關(guān)鍵詞:strong, weak, unowned
Swift 的內(nèi)存管理機(jī)制與 Objective-C一樣為 ARC(Automatic Reference Counting)。它的基本原理是,一個對象在沒有任何強引用指向它時,其占用的內(nèi)存會被回收。反之,只要有任何一個強引用指向該對象,它就會一直存在于內(nèi)存中。
- strong 代表著強引用,是默認(rèn)屬性。當(dāng)一個對象被聲明為 strong 時,就表示父層級對該對象有一個強引用的指向。此時該對象的引用計數(shù)會增加1。
- weak 代表著弱引用。當(dāng)對象被聲明為 weak 時,父層級對此對象沒有指向,該對象的引用計數(shù)不會增加1。它在對象釋放后弱引用也隨即消失。繼續(xù)訪問該對象,程序會得到 nil,不虧崩潰
- unowned 與弱引用本質(zhì)上一樣。唯一不同的是,對象在釋放后,依然有一個無效的引用指向?qū)ο?,它不?Optional 也不指向 nil。如果繼續(xù)訪問該對象,程序就會崩潰。
加分回答:
- weak 和 unowned 的引入是為了解決由 strong 帶來的循環(huán)引用問題。簡單來說,就是當(dāng)兩個對象互相有一個強指向去指向?qū)Ψ?,這樣導(dǎo)致兩個對象在內(nèi)存中無法釋放(詳情請參考第3章第3節(jié)第8題)。
weak 和 unowned 的使用場景有如下差別:
- 當(dāng)訪問對象時該對象可能已經(jīng)被釋放了,則用 weak。比如 delegate 的修飾。
- 當(dāng)訪問對象確定不可能被釋放,則用 unowned。比如 self 的引用。
- 實際上為了安全起見,很多公司規(guī)定任何時候都使用 weak 去修飾。
9.在Swift和Objective-C的混編項目中,如何在Swift文件中調(diào)用Objective-C文件中已經(jīng)定義的方法?如何在Objective-C文件中調(diào)用Swift文件中定義的方法?
- Swift中若要使用Objective-C代碼,可以在ProjectName-Bridging-Header.h里添加Objective-C的頭文件名稱,Swift文件中即可調(diào)用相應(yīng)的Objective-C代碼。一般情況Xcode會在Swift項目中第一次創(chuàng)建Objective-C文件時自動創(chuàng)建ProjectName-Bridging-Header.h文件。
- Objective-C中若要調(diào)用Swift代碼,可以導(dǎo)入Swift生成的頭函數(shù)ProjectName-Swift.h來實現(xiàn)。
- Swift文件中若要規(guī)定固定的方法或?qū)傩员┞督oObjective-C使用,可以在方法或?qū)傩郧凹由螥objc來聲明。如果該類是NSObject子類,那么Swift會在非private的方法或?qū)傩郧白詣蛹由螥objc。
10.用Swift 將協(xié)議(protocol)中的部分方法設(shè)計成可選(optional),該怎樣實現(xiàn)?
@optional 和 @required 是 Objective-C 中特有的關(guān)鍵字。
Swift中,默認(rèn)所有方法在協(xié)議中都是必須實現(xiàn)的。而且,協(xié)議里方法不可以直接定義 optional。先給出兩種解決方案:
- 在協(xié)議和方法前都加上 @objc 關(guān)鍵字,然后再在方法前加上 optional 關(guān)鍵字。該方法實際上是把協(xié)議轉(zhuǎn)化為Objective-C的方式然后進(jìn)行可選定義。示例如下:
@objc protocol SomeProtocol {
func requiredFunc()
@objc optional func optionalFunc()
}
- 用擴(kuò)展(extension)來規(guī)定可選方法。Swift中,協(xié)議擴(kuò)展(protocol extension)可以定義部分方法的默認(rèn)實現(xiàn),這樣這些方法在實際調(diào)用中就是可選實現(xiàn)的了。示例如下:
protocol SomeProtocol {
func requiredFunc()
func optionalFunc()
}
extension SomeProtocol {
func optionalFunc() {
print(“Dumb Implementation”)
}
}
Class SomeClass: SomeProtocol {
func requiredFunc() {
print(“Only need to implement the required”)
}
}
11.swift中,如何阻止一個方法屬性,屬性,下標(biāo)被子類改寫?
在類的定義中使用final關(guān)鍵字聲明類、屬性、方法和下標(biāo)。final聲明的類不能被繼承,final聲明的屬性、方法和下標(biāo)不能被重寫。
12.swift中,實現(xiàn)一個將整形數(shù)組全部轉(zhuǎn)化成對應(yīng)的字符串?dāng)?shù)組(eg: [1,2,3,4,5] -> ["1","2","3","4","5"])
var sampleArray: [Int] = [1,2,3,4,5]
sampleArray.map {
String($0)
}
//["1", "2", "3", "4", "5"]
13.swift中,關(guān)鍵字 guard 和 defer 的用法
guard也是基于一個表達(dá)式的布爾值去判斷一段代碼是否該被執(zhí)行。與if語句不同的是,guard只有在條件不滿足的時候才會執(zhí)行這段代碼。
guard let name = self.text else { return }
defer的用法是,這條語句并不會馬上執(zhí)行,而是被推入棧中,直到函數(shù)結(jié)束時才再次被調(diào)用。
defer {
//函數(shù)結(jié)束才調(diào)用
}
14.open與public的區(qū)別
- public:可以別任何人訪問,但是不可以被其他module復(fù)寫和繼承。
- open:可以被任何人訪問,可以被繼承和復(fù)寫。
15.struct與class 的區(qū)別
-
數(shù)據(jù)類型和內(nèi)存管理
- struct(結(jié)構(gòu)體):是值類型,直接包含數(shù)據(jù),賦值時進(jìn)行深拷貝,即復(fù)制內(nèi)容。每個struct的實例都是獨立的,修改一個不會影響其他實例。struct沒有引用計數(shù),不會因為循環(huán)引用導(dǎo)致內(nèi)存泄漏。
- class(類):是引用類型,存儲的是數(shù)據(jù)的引用地址。賦值時進(jìn)行淺拷貝,即復(fù)制引用地址。多個變量可以引用同一個實例,修改其中一個會影響所有引用該實例的變量。
-
繼承
- struct:不支持繼承,不能從一個struct繼承另一個struct。
- class:支持繼承,可以從一個類繼承另一個類,并且可以重寫父類的方法和屬性。
-
初始化
- struct:所有struct都會有一個編譯器自動生成的初始化器,保證所有成員都有初始值。可以在構(gòu)造函數(shù)中直接初始化屬性。
- class:需要在構(gòu)造函數(shù)中顯式定義初始化器,不能直接在構(gòu)造函數(shù)中初始化屬性,需要創(chuàng)建一個帶參數(shù)的構(gòu)造函數(shù)。
-
性能
- struct:分配在棧上,通常比class更快速,因為它是值類型,沒有引用計數(shù)的開銷。
- class:分配在堆上,有引用計數(shù)的開銷,可能會因為循環(huán)引用導(dǎo)致內(nèi)存泄漏。
16.swift把struct作為數(shù)據(jù)模型
16.1優(yōu)點
- 安全性: 因為 Struct 是用值類型傳遞的,它們沒有引用計數(shù)。
- 內(nèi)存: 由于他們沒有引用數(shù),他們不會因為循環(huán)引用導(dǎo)致內(nèi)存泄漏。
- 速度: 值類型通常來說是以棧的形式分配的,而不是用堆。因此他們比 Class 要快很多!
- 拷貝:Objective-C 里拷貝一個對象,你必須選用正確的拷貝類型(深拷貝、淺拷貝),而值類型的拷貝則非常輕松!
- 線程安全: 值類型是自動線程安全的。無論你從哪個線程去訪問你的 Struct ,都非常簡單。
16.2 缺點
Objective-C與swift混合開發(fā):OC調(diào)用的swift代碼必須繼承于NSObject。
繼承:struct不能相互繼承。
NSUserDefaults:Struct 不能被序列化成 NSData 對象。
如何設(shè)置實時渲染?
@IBDesignable讓Interface Bulider在特定視圖上執(zhí)行實時渲染
復(fù)制代碼</pre>
異步同步任務(wù)的區(qū)別?
同步:等待任務(wù)完成,一個接一個,順可預(yù)測(Predictable Execution Order),通常情況在Main
異步:不分先后執(zhí)行順序完成任務(wù),順序不可預(yù)測(Unpredictable Order),通常在Background
復(fù)制代碼</pre>什么是NSError對象? NSError有三部分組成,分別為
DomainCodeUserInforDomain是一個字符串,標(biāo)記一個錯誤域NSError(domain: <#String#>, code: <#Int#>, userInfo: <#[String : Any]?#>)
復(fù)制代碼</pre>什么是Enum?
enum是一種類型,包含了相關(guān)的一組數(shù)據(jù)為什么使用synchronized? 保證在一定時間內(nèi),只有一個線程訪問它
strong, weak,copy 有什么不同?
strong:引用計數(shù)會增加weak:不會增加引用計數(shù)Copy: 意味著我們在創(chuàng)建對象時復(fù)制該對象的值什么是ABI? 應(yīng)用程序二進(jìn)制接口
在Cocoa中有哪些常見的設(shè)計模式 創(chuàng)造性:單例(Singleton) 結(jié)構(gòu)性: 適配器(Adapter) 行為:觀察者(Observer)
Realm數(shù)據(jù)庫的好處 a. 開源的DB framework b. 快 c. ios 安卓都可以使用
Swift 優(yōu)勢是什么? a. 類型安全 b. 閉包 c. 速度快
什么是泛型? 泛型可以讓我們定義出靈活,且可重用的函數(shù)和類型,避免重復(fù)代碼
解釋 Swift 中的 lazy? lazy是 Swift 中的一個關(guān)鍵字,他可以延遲屬性的初始化時間,知道用到這個屬性時,才去加載它
解釋什么是 defer? 延遲執(zhí)行,當(dāng)你離開當(dāng)前代碼塊,就會去執(zhí)行
KVC 和 KCO 的區(qū)別? KVC: 它是一種用間接方式訪問類的屬性的機(jī)制 KVO: 它是一種觀察者模式,被觀察的對象如果有改變,觀察者就會收到通知
Gurad的好處? 可以使語句變得更簡潔,避免嵌套很多層,可以使用break,return提前退.
17.Swift 高階函數(shù)
1.map 函數(shù)用于對集合中的每個元素應(yīng)用一個指定的轉(zhuǎn)換閉包,然后返回一個包含轉(zhuǎn)換結(jié)果的新集合。
2.filter 函數(shù)用于從集合中選擇滿足指定條件的元素,并返回一個包含滿足條件的元素的新集合。
3.reduce 函數(shù)用于將集合中的所有元素組合成單個值,并返回該值。
4.flatMap 函數(shù)用于對集合中的每個元素應(yīng)用一個轉(zhuǎn)換閉包,并將結(jié)果拼接成一個新的集合。
5.compactMap 函數(shù)用于對集合中的每個元素應(yīng)用一個轉(zhuǎn)換閉包,并過濾掉結(jié)果中的 nil 值。
6.allSatisfy 函數(shù)用于檢查序列中的所有元素是否都滿足指定條件。
18.Swift中的Any、AnyHashable、AnyObject和AnyClass:深入理解它們的區(qū)別
Swift是一種強大而靈活的編程語言,它支持多種數(shù)據(jù)類型,包括基礎(chǔ)類型、枚舉、結(jié)構(gòu)體、類等。在Swift中,Any、AnyHashable、AnyObject和AnyClass是四種特殊的類型,它們各自具有不同的特性和用途。
Any類型:
Any類型是Swift中一個非常特殊的類型,它可以表示任何類型。這意味著你可以將任何東西賦給一個Any類型的變量,包括基本數(shù)據(jù)類型、枚舉、結(jié)構(gòu)體、類等。使用Any類型可以讓你在編程中更加靈活,但是也需要注意,由于類型被隱式地轉(zhuǎn)換為了動態(tài)類型,所以在運行時可能會出現(xiàn)類型錯誤。AnyHashable類型:
AnyHashable類型是遵循Hashable協(xié)議的Any類型的別名。在Swift中,字典(Dictionary)和集合(Set)需要鍵(key)和元素(value)的類型遵循Hashable協(xié)議。由于Any類型可以表示任何類型,所以在實際使用中,你可能需要將Any類型的值轉(zhuǎn)換為特定的類型以作為字典或集合的鍵。使用AnyHashable可以讓你方便地進(jìn)行這樣的轉(zhuǎn)換。AnyObject類型:
AnyObject類型是一個協(xié)議,任何對象都實現(xiàn)了這個協(xié)議。它主要用來表示任何類的實例。在Swift中,你可以使用AnyObject來[存儲] "存儲")任何對象的實例。值得注意的是,由于所有的類都隱式地實現(xiàn)了這個協(xié)議,因此只有類實例可以被賦給一個AnyObject類型的變量,而結(jié)構(gòu)體和枚舉的實例則不能。AnyClass類型:
AnyClass類型是AnyObject.Type的別名,表示任意類的元類型。在Swift中,你可以使用AnyClass來存儲類的類型信息。這意味著你可以將一個類的類型作為AnyClass類型的值來使用,這在泛型編程中非常有用。
在實際使用中,這些特殊的類型可以幫助你更加靈活地處理各種數(shù)據(jù)類型,但是也需要注意它們可能帶來的類型安全問題。在可能的情況下,盡量使用更具體的數(shù)據(jù)類型而不是這些特殊的類型,以確保代碼的類型安全和可維護(hù)性。
總結(jié):
在Swift中,Any、AnyHashable、AnyObject和AnyClass這四種特殊的類型各自具有不同的特性和用途。理解它們的區(qū)別可以幫助你更好地編寫出靈活、高效且安全的代碼。然而,這些特殊的類型也可能帶來一些類型安全問題,因此在使用時需要謹(jǐn)慎權(quán)衡利弊。
19.Swift中枚舉的高級用法有哪些?
1、 關(guān)聯(lián)值:允許你存儲與枚舉成員值相關(guān)聯(lián)的自定義類型的值。這使得枚舉可以存儲更多的信息,并能根據(jù)不同的場景返回不同類型的關(guān)聯(lián)值。
2、 原始值:枚舉成員可以有原始值,常見的原始值類型有字符串、字符或任何整數(shù)或浮點數(shù)類型。這使得枚舉更容易在不同的上下文中轉(zhuǎn)換和使用。
3、 遞歸枚舉:通過在枚舉成員前使用indirect關(guān)鍵字,枚舉可以是遞歸的。這意味著枚舉成員的關(guān)聯(lián)值可以是枚舉本身的一個實例,非常適合表示具有遞歸結(jié)構(gòu)的數(shù)據(jù)模型,如樹形結(jié)構(gòu)。
4、 擴(kuò)展和協(xié)議:枚舉可以遵循協(xié)議,并且可以通過擴(kuò)展來增加額外的功能。這為在枚舉上定義共通的行為提供了一種強大的方式。
20.Swift 中如何實現(xiàn)線程安全?
實現(xiàn)線程安全的方法在Swift中是至關(guān)重要的,尤其是在多線程環(huán)境下操作共享資源時。以下是實現(xiàn)線程安全的幾種常用方法:
1、 使用串行隊列:創(chuàng)建一個串行DispatchQueue,并將所有對共享資源的訪問操作提交到這個隊列中。由于串行隊列一次只執(zhí)行一個任務(wù),這保證了同一時間只有一個線程能訪問該資源。
2、 使用同步鎖:Swift可以使用DispatchSemaphore或NSLock等鎖機(jī)制來同步對共享資源的訪問。在訪問資源前加鎖,在訪問后解鎖,以此來保證在任何時刻只有一個線程能訪問該資源。
3、 使用原子操作:對于簡單的數(shù)據(jù)類型,可以使用原子操作來實現(xiàn)線程安全。原子操作是系統(tǒng)級別的,能夠保證操作的完整性,不會被其他線程打斷。
4、 使用線程安全的數(shù)據(jù)結(jié)構(gòu):Swift標(biāo)準(zhǔn)庫和第三方庫提供了一些線程安全的數(shù)據(jù)結(jié)構(gòu),如ThreadSafeArray或Atomic等,這些數(shù)據(jù)結(jié)構(gòu)內(nèi)部已經(jīng)實現(xiàn)了線程安全的保護(hù)。
21.Swift 中的泛型編程及其好處。
1、 類型安全:泛型代碼讓你能夠?qū)懗龀橄蠛涂蓮?fù)用的函數(shù)和類型,同時保留類型檢查的優(yōu)點。這意味著編譯器可以自動檢測類型錯誤。
2、 減少代碼量:使用泛型可以減少重復(fù)代碼,因為你可以用單一的函數(shù)或類型來處理不同類型的數(shù)據(jù),而不是為每種數(shù)據(jù)類型編寫特定的函數(shù)或類型。
3、 提高性能:泛型代碼在編譯時被實例化,這意味著編譯器生成的代碼已經(jīng)是針對特定類型優(yōu)化的。這可以在保持代碼抽象和靈活性的同時,提供與非泛型代碼相同的運行時性能。
4、 提升表達(dá)能力和靈活性:泛型讓庫和框架的設(shè)計者能夠提供高度靈活和可配置的API,而無需犧牲類型安全或性能。
22.Swift 中如何利用閉包實現(xiàn)異步回調(diào)?
1、 定義一個接受閉包作為參數(shù)的函數(shù)。這個閉包的類型取決于你期望的回調(diào)數(shù)據(jù)類型和邏輯。
2、 在異步操作完成時,調(diào)用這個閉包,并將結(jié)果作為閉包的參數(shù)傳遞。
3、 當(dāng)你調(diào)用這個函數(shù)時,傳入一個閉包,這個閉包定義了當(dāng)異步操作完成并返回結(jié)果時需要執(zhí)行的操作。
23.Swift 中的內(nèi)存泄漏,以及如何避免?
1、 避免內(nèi)存泄漏的關(guān)鍵方法之一是使用弱引用(weak)和無主引用(unowned)。當(dāng)你預(yù)期引用可能會變成nil時,應(yīng)該使用弱引用;如果引用始終不會變成nil,使用無主引用。
2、 在閉包中,使用[weak self]或[unowned self]捕獲列表來打破循環(huán)強引用是一種常用的做法。這樣可以確保閉包內(nèi)部對實例的引用不會阻止Swift的自動引用計數(shù)(ARC)機(jī)制釋放實例。
3、 使用自動引用計數(shù)(ARC)工具和內(nèi)存分析器來識別和修復(fù)內(nèi)存泄漏。Xcode提供了強大的工具,如Leaks和Allocations,來幫助開發(fā)者找到和修復(fù)內(nèi)存泄漏問題。
24.Swift 中的動態(tài)派發(fā)是什么,它是如何工作的?
1、 當(dāng)你調(diào)用一個類的方法時,Swift運行時會查找這個類的虛擬派發(fā)表,找到對應(yīng)方法的實際實現(xiàn)地址,然后跳轉(zhuǎn)到這個地址執(zhí)行方法。
2、 由于動態(tài)派發(fā)的存在,Swift可以在運行時而非編譯時決定調(diào)用哪個方法的實現(xiàn),這增加了程序的靈活性,但也可能略微降低性能。
3、 Swift中默認(rèn)情況下類的方法是動態(tài)派發(fā)的。然而,通過使用final關(guān)鍵字標(biāo)記方法或類,可以阻止方法被重寫,從而允許編譯器優(yōu)化調(diào)用,采用更快的靜態(tài)派發(fā)。
25.Swift中,如何利用模式匹配優(yōu)化代碼邏輯?
1、 利用模式匹配,可以匹配各種類型的值,包括枚舉、元組和特定范圍的值。這使得處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)變得簡單直觀。
2、 模式匹配支持使用where子句來進(jìn)一步細(xì)化條件,提供了更高的靈活性和表達(dá)力。
3、 在處理集合時,模式匹配可以與for-in循環(huán)結(jié)合使用,以便于對集合中的每個元素執(zhí)行復(fù)雜的匹配邏輯。
4、 模式匹配不僅可以簡化代碼,提高代碼的可讀性,還能有效地減少錯誤。通過集中處理所有相關(guān)的條件分支,避免了零散的if或guard語句可能導(dǎo)致的邏輯遺漏。
26.Swift 中如何高效地使用枚舉來處理不同的狀態(tài)和事件?
1、 利用枚舉的關(guān)聯(lián)值來存儲與每個枚舉案例相關(guān)的額外信息。這使得枚舉可以表達(dá)更復(fù)雜的狀態(tài)或事件,同時保持代碼整潔和組織良好。
2、 使用枚舉來定義一組相關(guān)的命令或操作,然后通過switch語句來匹配并執(zhí)行相應(yīng)的邏輯。這種方式使得新增或修改命令變得非常簡單。
3、 結(jié)合使用枚舉和協(xié)議,可以定義一組遵循共同協(xié)議的枚舉,這樣即使它們代表不同的狀態(tài)或事件,也能以統(tǒng)一的方式處理。
4、 利用枚舉的原始值(通常用于表示靜態(tài)或不變的數(shù)據(jù))和計算屬性,可以為枚舉值附加更多的上下文信息,增加代碼的可讀性和易用性。
27.Swift 中的編譯時多態(tài)性和運行時多態(tài)性有何區(qū)別?
1、 編譯時多態(tài)性(也稱為靜態(tài)多態(tài)性)主要通過方法重載和泛型實現(xiàn)。在編譯時,編譯器根據(jù)調(diào)用的參數(shù)類型和數(shù)量決定使用哪個具體的方法或函數(shù)。泛型也是編譯時多態(tài)性的一個例子,它允許函數(shù)或類型與任何數(shù)據(jù)類型一起工作,類型檢查發(fā)生在編譯時。
2、 運行時多態(tài)性(也稱為動態(tài)多態(tài)性)在Swift中主要通過繼承和協(xié)議來實現(xiàn)。它允許在運行時決定調(diào)用哪個對象的哪個方法,這依賴于對象的實際類型。在Swift中,類的繼承關(guān)系和協(xié)議的實現(xiàn)提供了運行時多態(tài)性,使得同一接口可以有多個實現(xiàn),具體使用哪個實現(xiàn)在運行時通過動態(tài)派發(fā)來決定
28.Swift 中的訪問級別如何影響API設(shè)計和模塊結(jié)構(gòu)?
1、 明確的訪問級別有助于定義一個清晰的API邊界。通過將內(nèi)部實現(xiàn)細(xì)節(jié)設(shè)為private或fileprivate,可以隱藏不希望外部使用者訪問的部分,只暴露必要的接口給外部使用。
2、 使用public或open訪問級別可以明確指定哪些接口是設(shè)計用來被其他模塊或框架使用的。open訪問級別還允許在模塊外被繼承或重寫,適用于設(shè)計可擴(kuò)展的框架。
3、 合理的訪問級別設(shè)置有助于模塊的解耦。通過限制跨模塊的直接訪問,可以更容易地維護(hù)和重構(gòu)代碼,因為改動的影響范圍更加可控。
4、 在大型項目或團(tuán)隊協(xié)作中,合理利用訪問級別可以減少意外的修改和使用錯誤,提高代碼的安全性和穩(wěn)定性。
29.Swift 中的協(xié)議是什么,如何使用協(xié)議來定義委托模式?
1、 定義協(xié)議來聲明委托任務(wù)或功能。這些任務(wù)通常由委托者發(fā)起,委托方進(jìn)行實現(xiàn)。
2、 在委托者類型中,定義一個遵循該協(xié)議的可選屬性。這個屬性用于持有任何遵循協(xié)議的實例的引用。
3、 委托方類型實現(xiàn)該協(xié)議,提供協(xié)議中定義的任務(wù)或功能的具體實現(xiàn)。
4、 在適當(dāng)?shù)臅r候,委托者通過協(xié)議定義的方法調(diào)用委托方提供的實現(xiàn)。
30.Swift 中的屬性包裝器是什么?提供使用場景。
1、 數(shù)據(jù)驗證:可以創(chuàng)建屬性包裝器來自動檢查屬性值是否滿足特定條件,例如是否在給定的范圍內(nèi),或者是否符合正則表達(dá)式。
2、 管理線程訪問:對于多線程或并發(fā)編程,屬性包裝器可以用來確保屬性訪問的線程安全性,例如通過同步訪問控制。
3、 懶加載:屬性包裝器可以用于實現(xiàn)屬性的懶加載邏輯,即僅在第一次訪問屬性時計算其初始值。
4、 存儲管理:可以利用屬性包裝器來透明地實現(xiàn)屬性的持久化,比如自動從數(shù)據(jù)庫加載和保存數(shù)據(jù)。
5、 觀察者模式:屬性包裝器可以用來監(jiān)控屬性值的變化,執(zhí)行一些操作,如更新UI或觸發(fā)事件,當(dāng)屬性值改變時。
31.Swift 中的異步/等待(async/await)模式是什么?它解決了哪些問題?
1、 async標(biāo)記的函數(shù)表示它是異步的,可以在其內(nèi)部執(zhí)行耗時的操作而不阻塞當(dāng)前線程。
2、 await用來調(diào)用異步函數(shù),表示調(diào)用者需要等待異步操作完成。使用await時,編譯器會自動將代碼切換到合適的線程,確保當(dāng)前的用戶界面保持響應(yīng)。
3、 解決的問題包括:簡化異步代碼的編寫,使其更加直觀和易于理解;避免了嵌套回調(diào)導(dǎo)致的復(fù)雜性和可讀性差的問題;提高了代碼的可維護(hù)性和錯誤處理的清晰度。
4、 異步/等待模式還提高了并發(fā)任務(wù)的性能和效率,因為它允許系統(tǒng)更優(yōu)化地管理任務(wù)執(zhí)行的資源和調(diào)度。
32.在Swift中,如何使用協(xié)議來實現(xiàn)多態(tài)性?
1、 定義協(xié)議:首先定義一個或多個協(xié)議,聲明需要實現(xiàn)的方法和屬性。
2、 實現(xiàn)協(xié)議:不同的類、結(jié)構(gòu)體或枚舉可以遵守這些協(xié)議,并提供具體的實現(xiàn)。
3、 使用協(xié)議類型:在函數(shù)、方法或者變量中使用協(xié)議類型作為類型標(biāo)注。這允許你接受任何遵守該協(xié)議的實例,從而實現(xiàn)多態(tài)性。
4、 協(xié)議作為類型:協(xié)議本身可以作為類型使用,這意味著你可以聲明一個協(xié)議類型的變量或常量,它們在運行時可以引用任何遵守該協(xié)議的實例。
33.Swift中的可選鏈?zhǔn)鞘裁?,如何使用它來簡化代碼?
可選鏈(Optional Chaining)是一種在當(dāng)前可選項可能為nil的情況下查詢和調(diào)用屬性、方法及下標(biāo)的過程。如果可選項有值,那么可選鏈調(diào)用會成功;如果可選項是nil,則可選鏈調(diào)用返回nil。可選鏈可以讓你在不需要強制解包的情況下,安全地訪問可選項的屬性、方法和下標(biāo)。
1、 使用可選鏈代替強制解包:當(dāng)你嘗試從可選項中取出值時,可選鏈提供了一種不會引起運行時錯誤的方法。
2、 多級可選鏈:你可以通過連接多個可選鏈調(diào)用來深入訪問多層可選類型的屬性、方法和下標(biāo)。如果鏈中的任何一個節(jié)點是nil,整個表達(dá)式的結(jié)果也是nil。
3、 與可選綁定結(jié)合使用:可選鏈的結(jié)果是一個可選值,你可以使用可選綁定(if let或guard let)來檢測可選鏈的結(jié)果是否存在。
4、 對方法的可選鏈調(diào)用:如果你嘗試通過可選鏈調(diào)用方法,該方法的返回類型將是一個可選值,即使方法本身定義時返回的不是可選值。
34.Swift 中的動態(tài)庫和靜態(tài)庫有什么區(qū)別?
1、 靜態(tài)庫:在編譯時,靜態(tài)庫的代碼會被整合到最終的可執(zhí)行文件中。每個使用靜態(tài)庫的應(yīng)用都會有一份庫的拷貝,這意味著靜態(tài)庫的更新需要重新編譯應(yīng)用。
2、 動態(tài)庫:與靜態(tài)庫不同,動態(tài)庫在應(yīng)用運行時被加載。這意味著多個應(yīng)用可以共享同一份動態(tài)庫的拷貝,減少了應(yīng)用的體積。當(dāng)動態(tài)庫更新時,不需要重新編譯使用它的應(yīng)用,只需替換動態(tài)庫文件即可。
3、 內(nèi)存占用:使用靜態(tài)庫會增加應(yīng)用的總體積,因為庫的代碼被整合進(jìn)了應(yīng)用。而動態(tài)庫雖然可以減少單個應(yīng)用的體積,但如果有多個應(yīng)用同時運行并使用同一動態(tài)庫,它們將共享這份庫的內(nèi)存拷貝。
4、 兼容性和版本控制:動態(tài)庫更易于管理和更新,因為它們是獨立于應(yīng)用外的。但這也帶來了版本兼容性問題,需要確保應(yīng)用與動態(tài)庫的兼容性。
5、 安全性和隱私:靜態(tài)庫被編譯進(jìn)應(yīng)用中,更不易被替換或篡改。而動態(tài)庫由于是在運行時加載,可能面臨被替換的風(fēng)險,但也使得安全更新更加容易實施。