遇見(jiàn)的swift問(wèn)題合集规哲,不定期更新唉锌,現(xiàn)在找工作還是比較難袄简,機(jī)會(huì)少的可憐绿语。
1.逃逸閉包是什么有什么用吕粹?
@escaping修飾的閉包是逃逸閉包
所在函數(shù)結(jié)束后才會(huì)調(diào)用的閉包昂芜,必須添加@escaping關(guān)鍵字泌神,不然編譯報(bào)錯(cuò)
func methodCallback(closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now()+2) {
closure()
}
}
print("start at \(Date.now)")
methodCallback {
print("callback at \(Date.now)")
}
2.如何實(shí)現(xiàn)定義一個(gè)方法只有元素為String類(lèi)型的Array才能調(diào)用欢际?
在extension聲明的時(shí)候使用where關(guān)鍵字
public extension Array where Element == String {
//只有Array[String]能調(diào)用這個(gè)方法
func jk_convertToString() -> String {
var str = ""
for ele in self {
str = str + ele + ","
}
return str
}
}
var arr = [String]()
arr.append("abc")
arr.append(“456")
//成功編譯
let res = arr.jk_convertToString()
print(res)
// 編譯報(bào)錯(cuò)
//let ages = [1, 2, 3, 4, 5]
//ages.jk_convertToString()
3.swift中protocol如何實(shí)現(xiàn)optional患久?
有兩種方案:
3.1 協(xié)議添加@objc
3.2 使用extension對(duì)協(xié)議進(jìn)行擴(kuò)展
擴(kuò)展知識(shí):
1.什么是尾隨閉包蒋失?
閉包作為方法的最后一個(gè)參數(shù)時(shí)篙挽,就是尾隨閉包铣卡。在調(diào)用的時(shí)候可以有一些簡(jiǎn)略的寫(xiě)法煮落,最主要的功能應(yīng)該是炫技旋讹。
//尾隨閉包骗村,定義一個(gè)方法,最后一個(gè)參數(shù)是閉包
func methodWithClosure(closure:(_ info: String) -> Void) {
closure("info from closure")
}
//普通的寫(xiě)法
methodWithClosure { info in
print(info)
}
//這是尾隨閉包的寫(xiě)法
methodWithClosure() {info in
print(info)
}
//如果閉包內(nèi)實(shí)現(xiàn)只有一行代碼裙秋,可以這樣簡(jiǎn)寫(xiě)(裝逼)
methodWithClosure() { print($0) }
2.什么是范型摘刑?
范型看起來(lái)很高大上枷恕,可以理解成占位符徐块。在方法名后邊加上<T>,后邊的參數(shù)類(lèi)型都可以設(shè)置為T(mén)昼激,看一下例子很快就能理解橙困。
func showYourSelf<T>(param: T) {
//打印入?yún)⒌念?lèi)型
print("This is \(T.self)")
}
var arr = [String]()
arr.append("abc")
arr.append("456")
showYourSelf(param: arr)
var str = "a string"
showYourSelf(param: str)
var dic = ["key":"value"]
showYourSelf(param: dic)
/*
輸出結(jié)果
This is Array<String>
This is String
This is Dictionary<String, String>
*/