在一次面试的时候可能会问 NSError和Error的区别 我当时懵了 因为基本上不用Error 在用的时候也没有关注那么多,就直接说平时都是转成NSError再用,么有什么区别 结果可想而知 基本Game Over,后面想了下 是不是哪里不对,为什么要怎么问,其实以前也看过的,因为平时没有怎么关注,根据人的记忆曲线,基本就忘了,在这里记录下来,以后直接可以看,还有大家可以一起分享讨论
先看定义: 是一个协议
public protocol Error { } extension Error { }
在看NSError 是 实现的Error的扩展了的 所以通常情况下 如果是系统很多底层操作抛出异常都是可以直接转成NSError的 都是可以直接转的
func fileManager(fileManager: FileManager, shouldProceedAfterError error: Error, copyingItemAtPath srcPath: String, toPath dstPath: String) -> Bool
有些error 也是不能转的
public typealias Failure = URLError
public struct URLError {
public static var errorDomain: String { get }
这个是 URLSessionTask 里面定义的Error 就不能直接转换
我的几个看法 Swift语言更多的是提高安全和性能,所以很多基础都是用结构体表示,毕竟NSError是oc产物,是一个对象,在结构体基本上不使用,还有定义成Error更多的是开发人员根据自己的实际需求,定义自己的错误信息展示。把决定权交给开发者,这样swift就更轻量。
Apple 为什么要这样设计 不直接定义个类似NSError这样的对象, 这个大家可以讨论下? 😄😄