为啥 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?的主要内容,如果未能解决你的问题,请参考以下文章