Apress の例によると、検索基準については、最初に変更可能なコピーを取得して文字列を検索し、次にその文字列の範囲外のオブジェクトを削除するというソウルションがあります。
Mutable DeepCopy では、次のような機能があります。
@implementation NSDictionary(MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy{
NSMutableDictionary *returnDict=[[NSMutableDictionary alloc]initWithCapacity:[self count]];
NSArray *keys=[self allKeys];
for(id key in keys)
{
id oneValue=[self valueForKey:key];
id oneCopy=nil;
if([oneValue respondsToSelector:@selector(mutableDeepCopy)])
oneCopy=[oneValue mutableDeepCopy];
else if([oneValue respondsToSelector:@selector(mutableCopy)])
oneCopy=[oneValue mutableCopy];
if(oneCopy==nil)
oneCopy=[oneValue copy];
[returnDict setValue:oneCopy forKey:key];
}
return returnDict;
}
@end
コードを理解できないときはデバッグするので、最初にデバッグし、最初に配列全体を表示したいときに、次のif
ステートメントに移動しoneCopy=[oneValue mutableCopy];
ます。なぜこのセレクターを選択し、選択しないのかを知りたいMutableDeep セレクター? この機能がまったく理解できません。この機能の主な目的は何ですか?
検索するために、この機能があります
-(void)handleSearchForTerm:(NSString *)searchTerm
{
NSMutableArray * sectionsToRemove=[[NSMutableArray alloc]init];
[self resetSearch];
for(NSString * key in self.keys)
{
NSMutableArray * array=[names valueForKey:key];
NSMutableArray *toRemove=[[NSMutableArray alloc]init];
for(NSString * name in array)
{
if([name rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location==NSNotFound)
[toRemove addObject:name];
}
if([array count]==[toRemove count])
[sectionsToRemove addObject:key];
[array removeObjectsInArray:toRemove];
}
[self.keys removeObjectsInArray:sectionsToRemove];
[table reloadData];
}
検索をリセットして全体を回復するために、以下にこの機能があります。私の問題は、self.keys
の助けを借りてオブジェクトを削除したことですhandleSearchForTerm
が、そこに行くとresetsearch
、削除せずにそれらのキー全体が再び返される可能性がMutablecopy
ありDeepMutableCopy
ます。
-(void)resetSearch{
NSMutableDictionary *allNamesCopy=[self.allNames mutableDeepCopy];
self.names=allNamesCopy;
NSMutableArray *keyArray=[[NSMutableArray alloc]init];
[keyArray addObjectsFromArray:[[self.allNames allKeys]sortedArrayUsingSelector:@selector(compare:)]];
self.keys=keyArray;
}