为啥 Xcode 认为我的变量在应该返回 NSString 时却返回了 NSURL?

Posted

技术标签:

【中文标题】为啥 Xcode 认为我的变量在应该返回 NSString 时却返回了 NSURL?【英文标题】:Why is Xcode thinking my variable is returning an NSURL when it should be returning an NSString?为什么 Xcode 认为我的变量在应该返回 NSString 时却返回了 NSURL? 【发布时间】:2013-03-19 17:46:14 【问题描述】:

我收到以下警告:“从 NSURL 分配 NSString 的指针类型不兼容”。

这是有问题的代码:

cell.articleURL.text = [self.articles[row] URL];

我正在为 Article 对象的 URL 属性值分配一个标签。 self.articles 数组仅用于保存 Article 对象。

在文章类中我有这个:

@property (nonatomic, strong) NSString *URL;

为什么它认为它是一个 NSURL?

【问题讨论】:

你有没有一个叫做 URL 的方法,它返回 NSURL? 好吧,这只是self.articles[row].URL 的长手,但由于self.articles[row] 返回一个ID,我不得不使用该方法。我猜是get方法。 您可以将self.articles[row] 的输出转换为正确的类,然后编译器就会对任一表示法感到满意。 但是我还是想知道,方法URL是从哪里调用的,因为他没有那个方法,cocoa/touch框架也没有 【参考方案1】:

问题在于self.articles[row] 将返回一个id 类型的对象,这意味着Objective-C 运行时无法确定应用哪个方法实现。它在另一个接口中找到URL 方法并使用该方法。

在 Matt Gallagher 的文章 A big weakness in Objective-C's weak typing 中有更多关于这个问题的信息。

【讨论】:

【参考方案2】:

重构您的代码以避免混淆:

Article *article = self.articles[0];
cell.articleURL.text = article.URL;

正如 Jim 所说,编译器正在为 id 对象找到错误的 URL 方法。通过拆分代码,您可以避免这个问题。

【讨论】:

【参考方案3】:

您的代码不知道数组的返回类型,因此猜测您可能从哪个类调用哪个方法。你需要像这样添加一个强制转换,它可以让编译器准确地知道期望哪个类:

cell.articleURL.text = [(Article *) self.articles[row] URL];

【讨论】:

【参考方案4】:

添加到@Jim 答案。您需要将[self.articles[row]] 的结果转换为声明@property (nonatomic, strong) NSString *URL; 的正确类。因此,Objective-C 运行时可以确定可以应用哪种方法实现。

[(Article *)[self.articles[row]] URL]

或者将其存储在Article 类型的变量中,然后在该对象上调用 URL。

【讨论】:

【参考方案5】:
cell.articleURL.text = [self.articles[row] URL];

正如你所说的self.articles[row] 返回id,所以你需要强制它的类型是Article

cell.articleURL.text = [(Article *)self.articles[row] URL];

你有一个名为 URL 的方法被self.articles[row] 返回的对象调用,它的返回类型是NSURL

由于我找不到任何具有名为 URL 的方法的类,因此它必须存在于您正在使用的任何框架或类/库中并且它正在被调用。

【讨论】:

【参考方案6】:

当您创建 NSMutableArray 时,编译器不知道您将存储哪种类型的对象。它是动态决定的。因此,当您尝试从以下位置获取 URL [self.articles[row] URL]; 编译器将其视为 id 类型。所以你必须使用类型转换cell.articleURL.text = [(Article *) self.articles[row] URL];

【讨论】:

以上是关于为啥 Xcode 认为我的变量在应该返回 NSString 时却返回了 NSURL?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UIButton 不在我认为应该在的位置?

Xcode 6 为啥 CLLocationManager 没有返回纬度和经度

为啥我的变量不取函数中的值?

为啥将局部变量推回 Vectorworks

为啥我的导航栏在 Xcode 中消失了?

为啥将变量与 0.0 进行比较会返回 false? [复制]