当前位置: 首页 > 面试题库 >

Swift惯用错误检查

莘昊
2023-03-14
问题内容

假设您有一个像这样的函数:

func getSomething(error: NSErrorPointer) -> Something

而您通常以这种方式使用它:

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

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

  1. 如果error == nil我们可以假设a永远是零,反之亦然?
  2. 我们首先要检查什么error:(无)或a(确认不是零)?
  3. a != nil && error != nil在某些情况下可以是真的吗?

谢谢!


问题答案:

比较
《错误处理编程指南》中从方法返回的处理错误对象:

重要提示:
方法的返回值指示成功或失败。尽管在方法可通过直接返回nil或NO指示失败的情况下,保证在该Cocoa错误域中间接返回错误对象的Cocoa方法可以保证返回此类对象,但是在尝试使用该方法执行任何操作之前,应始终检查返回值是否为nil或NO。
NSError对象。

因此,对于Cocoa / Cocoa Touch方法,您应该始终先检查返回值。可以保证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 3.0中调用委托函数。调用时,我收到一个错误,该错误显示“致命错误:在打开可选值时意外发现nil”。我已经给出了静态值,动态值没有用。 我用以下方式调用这个代表。 我在这里做得不对。下面是我设置的代理。

  • 这相当长,但可能是一个非常容易修复的问题。大部分都是代码,只需跳到底部,就会有一个tl;博士 嘿,所以我已经遵循了大约10个关于让Admob间质在我的Swift Spritekit游戏中工作的教程。除了我看到的所有教程都使用带有按钮的IBAction。目前,我希望广告每隔一段时间在菜单上弹出一次。(只是为了开始,我可能会在以后更改它)。这一切都非常完美,但是一旦我点击播放按钮(进入不同的场景),然

  • 错误: 错误:可选(错误域=com.amazonaws.AWSJSONBuilderErrorDomain Code=4"序列化对象既不是有效的json Object也不是NSData对象:"UserInfo={NSLocalizeddescription ption=序列化对象既不是有效的json Object也不是NSData对象:}) 代码: 我已经看了我的lambda日志,我可以看到我甚至

  • 对于我的刽子手游戏,我想有一堆错误信息来检查输入的不止一个字母,猜测同一个字母两次,等等。到目前为止我的完整代码: 我遇到的最大问题是检查用户是否输入了相同的字母两次。所以你只能猜一次字母表中的一个字母。此外,它检查用户输入的多个字母是否有错误的代码,我相信,因为如果我不希望它将这些字母添加到猜测字母框中,它会以任何方式添加这些字母。(即,用户猜测“hf”,在猜测的字母中出现“hf”,在这里它应该

  • 问题内容: 我正在尝试使用将a的布尔值传递给另一个类。由于某些原因,在包含开关的类中,应该将值设置为的语句无法读取开关声明。 ViewController.swift 在第一个If语句(shrimpSwitch.on)中,它将显示Expected Declaration。我是在声明所有开关错误吗?任何帮助,将不胜感激。谢谢 问题答案: 问题是您需要将代码放入方法中。您所需要做的就是将其移动到vie

  • 问题内容: 是否有更好的解决方案将Swift错误从一个函数转发到另一个函数? 此刻,我正在这样做: 因此,要转发错误,我需要捕获所有错误并再次抛出它们。 有更好的解决方案吗? 问题答案: 是的:不要将其包装在do … catch块中。