最近在梳理 Swift 4.2 以来的变动时,发现一个从 4.0 时代开始就被忽略的小细节,关于 Array。

为了完全与 Objective-C 划清界限,Swift 对 Array 进行彻彻底底的重构,进入 Swift 4.0以后,Swift 就将不少兼容 NSArray 的 API 移除了,这其中就包括一个使用频率非常高的 Array.index(of anObject: Any) -> Int

当你试图在敲代码时联想这个API,就会发现编译器没有任何提示,标准库里也找不到这个方法(此前一段时间里我一度认为这是编译器的 bug),但是3.0 时代遗留的代码却不会产生任何警告,甚至你还可以通过盲打来使用这个API,直到今天重新翻阅 Swift 文档才发现,这个 API 是确确实实被移除了,但为什么可以通过盲打来继续使用呢,这是因为 index(of anObject: Any) -> Int 已经「彻彻底底」变为 NSArray 专属了,当你以盲打的方式"强行"使用这个API时,编译器会自动为你的 Array 转换成 针对 NSArray 的兼容模式,实际上你调用的是 NSArray 的方法。

那 Array 难道没有提供相应的替代方法吗?当然有。在文档中我找到了这个方法: func firstIndex(of: Element) -> Int?

看着这个方法名已经很容易猜到它的作用,返回数组中最先匹配到该元素的索引值,NSArray 的内部对 index(of: ) 的实现出于性能的考虑也不外乎也是找到符合条件的第一个元素就停止寻找,直接返回索引值,所以这个方法应该就是替代方案,为了验证想法尝试了一下,果然如此

let array = ["1", "2", "3", "4", "5"]
let index = array.firstIndex(of: "3")
printLog("\(String(describing: index))")

/// print : 2
展开
评论