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 - 这不是boolerror 应声明为 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

Objective-C 我应该使用 NSError 以及为啥 presentError 函数不起作用

Objective-C:断言 vs. 异常 vs. 错误

强制返回 `id` 和 inout NSError 的 Objective-C 方法桥接到可选返回