答“卓同学的 Swift 面试题”--中篇

接上篇,答“卓同学的 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 类遵循,其他类以及结构体和枚举均不能遵循这种协议

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 1、范型范型所解决的问题 函数、方法、类型:类,结构体,枚举,元组类型,协议参数,返回值,成员函数参数,成员属性类...
    我是小胡胡123阅读 853评论 0 1
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,136评论 0 62
  • 题目: 卓同学的 Swift 面试题 翻了 喵神 和 SwiftGG 的资料, 借鉴了 Arco_vv 和 En...
    青木KON阅读 1,974评论 3 8
  • 很多东西,越是牢牢抓住越是不能得到。比如爱情。比如我想要的青春。 今年成功的升学做了学姐,比起以往的初中高中这个大...
    不只有爱情阅读 542评论 0 0