一次面试经过 Error与NSError的区别

415 阅读1分钟

在一次面试的时候可能会问 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这样的对象, 这个大家可以讨论下? 😄😄