遇见的swift问题合集,不定期更新,现在找工作还是比较难,机会少的可怜。
1.逃逸闭包是什么有什么用?
@escaping修饰的闭包是逃逸闭包
所在函数结束后才会调用的闭包,必须添加@escaping关键字,不然编译报错
func methodCallback(closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now()+2) {
closure()
}
}
print("start at \(Date.now)")
methodCallback {
print("callback at \(Date.now)")
}
2.如何实现定义一个方法只有元素为String类型的Array才能调用?
在extension声明的时候使用where关键字
public extension Array where Element == String {
//只有Array[String]能调用这个方法
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)
// 编译报错
//let ages = [1, 2, 3, 4, 5]
//ages.jk_convertToString()
3.swift中protocol如何实现optional?
有两种方案:
3.1 协议添加@objc
3.2 使用extension对协议进行扩展
扩展知识:
1.什么是尾随闭包?
闭包作为方法的最后一个参数时,就是尾随闭包。在调用的时候可以有一些简略的写法,最主要的功能应该是炫技。
//尾随闭包,定义一个方法,最后一个参数是闭包
func methodWithClosure(closure:(_ info: String) -> Void) {
closure("info from closure")
}
//普通的写法
methodWithClosure { info in
print(info)
}
//这是尾随闭包的写法
methodWithClosure() {info in
print(info)
}
//如果闭包内实现只有一行代码,可以这样简写(装逼)
methodWithClosure() { print($0) }
2.什么是范型?
范型看起来很高大上,可以理解成占位符。在方法名后边加上<T>,后边的参数类型都可以设置为T,看一下例子很快就能理解。
func showYourSelf<T>(param: T) {
//打印入参的类型
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)
/*
输出结果
This is Array<String>
This is String
This is Dictionary<String, String>
*/
网友评论