以下方法向我显示警告,但应用程序正在按预期执行。请你查一下代码,告诉我那里有什么问题?只有当这对应用程序很重要时,如果警告没有给应用程序带来危险,那么告诉我是否可以让它成为现实......谢谢
警告是:方法定义中的Incompatible pointer types assigning to 'NSMutableArray *' from 'NSArray *'
。
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
self.searchResults = [[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings)
{
ToDoItem * item = evaluatedObject;
NSString* name = item.todoName;
//searchText having length < 3 should not be considered
if (!!searchText && [searchText length] < 3) {
return YES;
}
if ([scope isEqualToString:@"All"] || [name isEqualToString:scope]) {
return ([name rangeOfString:searchText].location != NSNotFound);
}
return NO; //if nothing matches
}]];
}
答案 0 :(得分:1)
filteredArrayUsingPredicate
返回不可变 NSArray
,
并且您似乎已将searchResults
声明为NSMutableArray
。
所以要么
searchResults
的声明更改为NSArray
或mutableCopy
。正确的解决方案取决于您是否需要稍后修改searchResults
。
答案 1 :(得分:1)
self.searchResults = [[[self.fetchedResultsController fetchedObjects]
filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:
^BOOL(id evaluatedObject, NSDictionary *bindings) mutableCopy];
mutableCopy
是许多对象的方法,其中存在mutable
和immutable
版本。对于NSArray
,NSString
,NSData
等内容,在其中一个实例上调用mutableCopy
将返回包含相同内容的mutable
版本作为你调用方法的原始对象。
例如,
NSArray *immutableArray = [NSArray arrayWithObjects:@"foo",@"bar"];
NSMutableArray *mutableArray = [immutableArray mutableCopy];
但是,如果您不打算searchResults
成为NSMutableArray
,则应更改其声明:
@property (nonatomic,strong) NSArray *searchResults
如果您不打算将其变为可变,则应将其声明为不可变。
鉴于您声称该警告不会影响您应用的效果,我最好的猜测是,正确的解决方案是将searchResults
从NSMutableArray
更改为NSArray
。