gpt4 book ai didi

Swift 惯用的错误检查

转载 作者:搜寻专家 更新时间:2023-10-31 22:00:35 24 4
gpt4 key购买 nike

假设您有这样一个函数:

func getSomething(error: NSErrorPointer) -> Something

你通常这样使用它:

var error : NSError? = nil
let a = getSomething(&error)

在这里检查错误的惯用方法是什么?更具体的问题:

  1. 如果 error == nil 我们可以假设 a 永远不会为 nil 并且反之亦然反之亦然?
  2. 我们应该首先检查什么:error(因为它是 nilness)或 a(为了确认它不是零)?
  3. a != nil && error != nil 在某些情况下是否可以为真?

谢谢!

最佳答案

比较 Handling Error Objects Returned From Methods在《错误处理编程指南》中:

Important: Success or failure is indicated by the return value of the method. Although Cocoa methods that indirectly return error objects in the Cocoa error domain are guaranteed to return such objects if the method indicates failure by directly returning nil or NO, you should always check that the return value is nil or NO before attempting to do anything with the NSError object.

因此,对于 Cocoa/Cocoa Touch 方法,您应该始终检查返回值值(value)第一。保证 error != nil 如果方法失败,但如果方法成功,则不能明确保证 error == nil

例子:

JSON 序列化

var error : NSError?
if let jsonObj = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) {
// success
} else {
// failure
println("Invalid JSON data: \(error!.localizedDescription)")
}

核心数据获取请求

var error : NSError?
if let result = context.executeFetchRequest(request, error: &error) {
// success, result has zero or more elements
} else {
// failure
println("Fetch failed: \(error!.localizedDescription)")
}

复制文件

var error : NSError?
if !NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath, error: &error) {
println("Cannot copy file: \(error!.localizedDescription)")
}

当然你可以为自己的函数定义自己的规则,但我会遵循相同的 Apple 指南。


更新:从 Swift 2 开始, 产生错误的 Cocoa 方法是翻译成抛出错误的 Swift 函数,以及这个错误必须用 try-catch 处理。这是 Swift 2 版本以上例子:

JSON 序列化

do {
let jsonObj = try NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
// success
} catch let error as NSError {
// failure
print("Invalid JSON data: \(error.localizedDescription)")
}

核心数据获取请求

do {
let result = try context.executeFetchRequest(request)
// success, result has zero or more elements
} catch let error as NSError {
// failure
print("Fetch failed: \(error.localizedDescription)")
}

复制文件

do {
try NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath)
} catch let error as NSError {
print("Cannot copy file: \(error.localizedDescription)")
}

关于Swift 惯用的错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29384218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com