我收到以下警告:“不兼容的指针类型从NSURL分配NSString”。
以下是相关代码:
cell.articleURL.text = [self.articles[row] URL];
我正在为Article对象的URL属性赋值。 self.articles数组仅用于保存Article对象。
在文章课中我有这个:
@property (nonatomic, strong) NSString *URL;
为什么它认为这是一个NSURL?
答案 0 :(得分:5)
问题是self.articles[row]
将返回类型为id
的对象,这意味着Objective-C运行时无法确定应用哪种方法实现。它在另一个界面中找到URL
方法并使用该方法。
Matt Gallagher撰写的文章A big weakness in Objective-C's weak typing中有关于此问题的更多信息。
答案 1 :(得分:0)
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
的方法的类,所以这必须存在于你正在使用的任何框架或类/库中并且它被调用。
答案 2 :(得分:0)
重构您的代码以避免混淆:
Article *article = self.articles[0];
cell.articleURL.text = article.URL;
正如Jim所说,编译器正在为URL
对象找到错误的id
方法。通过拆分代码,可以避免此问题。
答案 3 :(得分:0)
您的代码不知道数组的返回类型,因此猜测您可能从哪个类调用哪个方法。你需要像这样添加一个强制转换,这样编译器就可以确切地知道期望的类:
cell.articleURL.text = [(Article *) self.articles[row] URL];
答案 4 :(得分:0)
添加到@Jim回答。您需要将[self.articles[row]]
的结果强制转换为声明@property (nonatomic, strong) NSString *URL;
的正确类。因此,Objective-C运行时可以确定可以应用哪种方法实现。
即
[(Article *)[self.articles[row]] URL]
或者将其存储在Article
类型的变量中,然后在该对象上调用URL。
答案 5 :(得分:0)
当你创建NSMutableArray
时,编译器不知道你将存储什么类型的对象。它是动态决定的。所以当你试图从URL
获取时
[self.articles[row] URL];
编译器将其视为id类型。所以你必须使用类型转换cell.articleURL.text = [(Article *) self.articles[row] URL];