Objective-C 中错误(NSError)构造的解释(使用未声明的标识符“错误”)
Posted
技术标签:
【中文标题】Objective-C 中错误(NSError)构造的解释(使用未声明的标识符“错误”)【英文标题】:Explanation of the &error (NSError) construct in Objective-C (Use of undelcared identifier 'error') 【发布时间】:2014-09-12 01:58:24 【问题描述】:我是 ios 开发的新手,我正在开发一个类似于 Instagram 的应用程序来教我基本知识。我正在通过AnyPic Tutorial 通过parse.com 工作,因为它很有用,但是在 AppDelegate.m 中,有一个函数,代码请求解析一些 facebook 数据,并返回一些数据。我的问题是以下代码行:
PFQuery *facebookFriendsQuery = [PFUser query];
[facebookFriendsQuery whereKey:kPA_UserFacebookIDKey containedIn:facebookIds];
NSArray *facebookFriends = [facebookFriendsQuery findObjects:&error];
// This if statement gives me the following error:
// "use of undeclared identifier 'error'"
if (!error)
这个结构:
NSArray *facebookFriends = [facebookFriendsQuery findObjects:&error];
if (!error)
看起来很简单,但它在我的代码中给了我一个错误(使用未声明的标识符“错误”),但在 AnyPic 文件中没有警告。
那么有人可以解释一下这个构造是什么(&error),也许我为什么会收到这个“未声明的标识符”错误?
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
编辑(2014 年 9 月 14 日):因为这篇文章的标题是“Objective-C 中 &error (NSError) 构造的解释”,所以我想我实际上会解释一下我学到的东西,以防它可能会有所帮助 现在对我来说似乎很傻,因为我所缺少的只是 error
变量声明,而 if (!error)
正在评估错误变量是 nil 还是 non-nil,但是混淆似乎是有道理的,因为在我非常熟悉的一种语言 php 中,可以从函数调用内部分配一个不存在的变量,并将其提升到调用它的函数的范围内。例如:
// In PHP
preg_match_all("/myregex/", $someString, $matches);
if ($matches)
// pregmatch has found some matches, and now there is a variable
// named $matches available to the same scope where preg_match_all was called
所以当我在 Objective-C 中看到类似(但在语法上不一样)的东西时:
// In Objective-C
NSArray *myArray = [self getObjects:&error];
if(!error)
// This is a compiler error, because the error variable
// doesn't exist at this point, because Objective-C won't
// let you assign variables in this way
所以解决方案是记住,PHP 和 Objective-C 是非常不同的,使用&
运算符将值(通过引用传递)转换为变量的正确语法如下:
// In Objective-C
NSError *error = nil; // <-- THIS IS EXTREMELY IMPORTANT!
NSArray *myArray = [self getObjects:&error];
if(!error)
// Now the compiler won't complain, because the error variable
// has been assigned. This block of code will run if the error variable
// is still equal to nil. Which means the [self getObjects:] ran without error.
else
// if error == YES, it means that the [self getObjects:] function
// encountered an error and has assigned the reference to the error into
// the error variable you previously assigned to nil, allowing it to
// evaluate as non-nil
希望这可以帮助遇到和我一样困惑的人。
【问题讨论】:
请在使用前声明布尔错误,上面包含&错误行 @HuyNghia - 这不是bool
。 error
应声明为 NSError*
。
必须声明每个变量。这是您应该首先学习的内容之一。
ahh.@HotLicks 对不起,我的错误
好吧,你已经不在 PHP 中了。
【参考方案1】:
您收到此错误是因为未定义变量 error
。
AppDelegate.m 从第 459 行开始,您会发现声明的错误变量。然后在第 472 行发生错误时更改该错误。然后在第 474 行,条件检查该变量以确定一切是否正常并继续。
NSError *error = nil; //line 459
NSArray *anypicFriends = [query findObjects:&error]; //line 472
if (!error) // line 474
【讨论】:
啊哈!就是这样。我错过了教程中的NSError *error = nil;
声明。谢谢!以上是关于Objective-C 中错误(NSError)构造的解释(使用未声明的标识符“错误”)的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Objective-C 的 init 中包含 NSError** 作为参数吗?
如何将 NSError.code 与 Swift 5 中的#defined 错误号进行比较
Objective-C 在自定义方法中将 NSError 指针传递给 NSFileManager