Ios 为什么Xcode认为我的变量在返回NSRL,而它应该返回NSString?
我收到以下警告:“从NSURL分配NSString的指针类型不兼容” 下面是有问题的代码:Ios 为什么Xcode认为我的变量在返回NSRL,而它应该返回NSString?,ios,objective-c,xcode,ios5,ios6,Ios,Objective C,Xcode,Ios5,Ios6,我收到以下警告:“从NSURL分配NSString的指针类型不兼容” 下面是有问题的代码: cell.articleURL.text = [self.articles[row] URL]; 我正在为标签指定文章对象的URL属性的值。self.articles数组仅用于保存项目对象 在文章类中,我有以下内容: @property (nonatomic, strong) NSString *URL; 为什么它认为它是一个NSURL?问题是self.articles[row]将返回一个类型为id的
cell.articleURL.text = [self.articles[row] URL];
我正在为标签指定文章对象的URL属性的值。self.articles数组仅用于保存项目对象
在文章类中,我有以下内容:
@property (nonatomic, strong) NSString *URL;
为什么它认为它是一个NSURL?问题是
self.articles[row]
将返回一个类型为id
的对象,这意味着Objective-C运行时无法确定应用哪种方法实现。它在另一个接口中查找URL
方法并使用该方法
马特·加拉赫的文章中有关于这个问题的更多信息
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
的方法,因此在您正在使用的任何框架或类/库中都必须存在该方法,并且该方法正在被调用。重构代码以避免混淆:
Article *article = self.articles[0];
cell.articleURL.text = article.URL;
正如Jim所说,编译器正在为
id
对象找到错误的URL
方法。通过拆分代码,可以避免这个问题。您的代码不知道数组的返回类型,因此可以猜测您可能从哪个类调用哪个方法。您需要像这样添加一个cast,它让编译器确切地知道需要哪个类:
cell.articleURL.text = [(Article *) self.articles[row] URL];
添加到@Jim answer。您需要将
[self.articles[row]]
的结果强制转换到正确的类,其中@property(非原子,强)NSString*URL代码>已声明。因此Objective-C运行时可以确定可以应用哪种方法实现
i、 e
或者将其存储在Article
类型的变量中,然后调用该对象上的URL。当您创建NSMutableArray时,编译器不知道将存储哪种类型的对象。这是动态决定的。因此,当您试图从
[self.articles[row]URL]代码>编译器将其视为id类型。因此,您必须使用类型castcell.articleURL.text=[(Article*)self.articles[row]URL]
您是否有一个名为URL的方法,它返回NSURL?好吧,这只是self.articles[row].URL
的老生常谈,但由于self.articles[row]
返回一个ID,我不得不使用该方法。我猜是get方法。您可以将self.articles[row]
的输出转换到适当的类中,然后编译器会对其中任何一种表示法感到满意。但我仍然想知道,从哪里调用方法URL,因为他没有该方法,cocoa/touch框架也没有
[(Article *)[self.articles[row]] URL]