Swift面试问题(一)

遇见的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,看一下例子很快就能理解。

func showYourSelf(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
This is String
This is Dictionary
*/

你可能感兴趣的:(Swift面试问题(一))