接上篇,答“卓同学的 Swift 面试题”--上篇
面试题链接:卓同学的 Swift 面试题
在上篇中,回答了基础篇前11题,接着回答中间12题:
12. String 与 NSString 的关系与区别
13. 怎么获取一个 String 的长度
14. 如何截取 String 的某段字符串
15. throws 和 rethrows 的用法与作用
16. try? 和 try!是什么意思
17. associatedtype 的作用
18. 什么时候使用 final
19. public 和 open 的区别
20. 声明一个只有一个参数没有返回值闭包的别名
21. Self 的使用场景
22. dynamic 的作用
23. 什么时候使用 @objc
12. String 与 NSString 的关系与区别
Swift 的String类型与 Foundation NSString类进行了无缝桥接。他们最大的区别就是:String是值类型,而NSString是引用类型。
其他方面的差异就体现在各自api 上的差异。
13.怎么获取一个 String 的长度
let length1 = "string".characters.count
let length2 = "string".data(using: .utf8).count
let length3 = ("string" as NSString).length
14. 如何截取 String 的某段字符串
每一个String值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个Character的位置
具体参见:Accessing and Modifying a String
15.throws 和 rethrows 的用法与作用
- throw异常,这表示这个函数可能会抛出异常,无论作为参数的闭包是否抛出异常
- rethrow异常,这表示这个函数本身不会抛出异常,但如果作为参数的闭包抛出了异常,那么它会把异常继续抛上去
public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
16. try? 和 try!是什么意思
** try?
** 是用来修饰一个可能会抛出错误的函数。会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方法抛出错误,程序不会发崩溃,而返回一个nil,如果没有抛出错误则返回可选值
** try!
** 会忽略错误传递链,并声明“do or die”。如果被调用函数或方法没有抛出异常,那么一切安好;但是如果抛出异常,二话不说,给你崩
参考:what's difference in try! and try?
17. associatedtype 的作用
Swift中的协议(protocol)采用的是“Associated Types”的方式来实现泛型功能的
18. 什么时候使用 final
- 通过使用final提升程序性能,其实就算把所有不需要继承的方法、类都加上final关键字,效果也是微乎其微。
- final 的正确使用场景-----权限控制, 具体情况如下:
1.
类或者方法的功能确实已经完备了
通常是一些辅助性质的工具类或者方法,比如MD5加密类这种,算法都十分固定,我们基本不会再继承和重写
2.
避免子类继承和修改造成危险
3.
为了让父类中某些代码一定会执行
19. public 和 open 的区别
** open **
- open 修饰的 class 在 Module 内部和外部都可以被访问和继承
- open 修饰的 func 在 Module 内部和外部都可以被访问和重载(override)
** public **
- public 修饰的 class 在 Module 内部可以访问和继承,在外部只能访问
- public 修饰的 func 在 Module 内部可以被访问和重载(override),在外部只能访问
20. 声明一个只有一个参数没有返回值闭包的别名
typealias IntBlock = (Int) -> Void
21. Self 的使用场景
- 协议中声明
protocol Hello {
func hello() -> Self
}
- 协议扩展
protocol MyProtocol { }
extension MyProtocol where Self: UIView { }
22. dynamic 的作用
- dynamic 可以用来修饰变量或函数,告诉编译器使用动态分发而不是静态分发。
- 使用动态分发,可以更好的与OC中runtime的一些特性(如CoreData,KVC/KVO)进行交互
- 标记为dynamic的变量/函数会隐式的加上@objc关键字,它会使用OC的runtime机制
23. 什么时候使用 @objc
在协议中使用 optional 关键字作为前缀来定义可选要求。可选要求用在你需要和 Objective-C 打交道的代码中。协议和可选要求都必须带上@objc属性。标记 @objc 特性的协议只能被继承自 Objective-C 类的类或者 @objc 类遵循,其他类以及结构体和枚举均不能遵循这种协议