方法定义警告

时间:2014-01-19 18:05:55

标签: ios core-data

以下方法向我显示警告,但应用程序正在按预期执行。请你查一下代码,告诉我那里有什么问题?只有当这对应用程序很重要时,如果警告没有给应用程序带来危险,那么告诉我是否可以让它成为现实......谢谢

警告是:方法定义中的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
}]];
}

2 个答案:

答案 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是许多对象的方法,其中存在mutableimmutable版本。对于NSArrayNSStringNSData等内容,在其中一个实例上调用mutableCopy将返回包含相同内容的mutable版本作为你调用方法的原始对象。


例如,

NSArray *immutableArray = [NSArray arrayWithObjects:@"foo",@"bar"];
NSMutableArray *mutableArray = [immutableArray mutableCopy];

但是,如果您不打算searchResults成为NSMutableArray,则应更改其声明:

@property (nonatomic,strong) NSArray *searchResults

如果您不打算将其变为可变,则应将其声明为不可变。


鉴于您声称该警告不会影响您应用的效果,我最好的猜测是,正确的解决方案是将searchResultsNSMutableArray更改为NSArray