假设您有一个像这样的函数:
func getSomething(error: NSErrorPointer) -> Something
而您通常以这种方式使用它:
var error : NSError? = nil
let a = getSomething(&error)
在这里检查错误的惯用方式是什么?更具体的问题:
error == nil
我们可以假设a
永远是零,反之亦然?error
:(无)或a
(确认不是零)?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块中。