如何使用NSPredicate作为过滤器的快速枚举修改NSMutableSet

时间:2014-02-21 05:10:58

标签: objective-c nspredicate nsset

新手问题,

我有 3 Class ,其中3个是NSObject的子类

一个。集合类

这个类将有2个属性

  1. masterSongs(包含所有歌曲)声明为NSMUtableSet(复制,非原子)
  2. listofPlaylists(包含所有播放列表)声明为NSMutableArray(copy,nonatomic)
  3. 湾播放列表类

    此类将具有2个属性

    1. playListName声明为NSString
    2. songLists声明为NSMutableArray(强,非原子),只存储对歌曲的引用而不是歌曲的副本。
    3. ℃。歌曲类

      此类有4个属性声明为NSString:

      1. 标题
      2. 艺术家
      3. playingtime
      4. 专辑
      5. 问题:

        1. 我想为Collection类创建removeSong方法,所以当我从Collection(masterSongs)中删除特定歌曲时,它还会删除存储在Collection.listofPlaylists中的所有playList中的歌曲。但我遇到了语法*。
        2. * 我正在使用查找方法创建一个NSSet,然后使用该集合从NSMutableSet masterSongs中删除歌曲对象 - minusSet:method

          另外,我found that在枚举时更改修改NSMutableSet很危险。

          到目前为止我尝试过:

          - (NSSet *) lookUpTitle: (NSString *)aName {
          
          NSPredicate *filter = [NSPredicate predicateWithFormat:@"title == %@",aName];
          
          NSSet *result = [self.masterSongs filteredSetUsingPredicate:filter];
          
          if ([result count] == 0) {
              NSLog(@"not found");
          
              return nil;
          }
          
          
          else{
              return result;
          }
          

          }

          - (void) removeSong: (NSString *)zSong{
          
          
              for (Song *aSong in masterSongs) {
          
          
          
                  if ([self lookUpTitle:zSong] != nil) {
          
                      NSMutableSet *container = [NSMutableSet setWithSet:self.masterSongs];
                  }
          
              }
          
          }
          
          
          
           - (void) addSong :(Song *)aSong{
              if (![masterSongs containsObject:aSong]) {
          
                  [masterSongs addObject:aSong];
          
              } }
          
          -(void) addPlaylist: (Playlist *)aPlayList{
          
              if ([listOfPlaylists containsObject:aPlayList]==YES) {
          
              }
              else
                  [listOfPlaylists addObject:aPlayList];
          
          
          }
          
          -(void) removePlaylist: (Playlist *)aPlayList{
              if ([listOfPlaylists containsObject:aPlayList]) {
          
                  [listOfPlaylists removeObjectIdenticalTo:aPlayList];
              }
          
              else{
                  ;
              }
          
          }
          

1 个答案:

答案 0 :(得分:0)

-lookUpTitle:为您完成了大部分工作。它返回一组需要删除的歌曲。您使用-minusSet:将其从NSMutableSet中删除。要从播放列表中删除歌曲,您需要循环播放播放列表并删除集中的歌曲。您使用-removeObjectsInArray:将其从NSMutableArray删除。

- (void)removeSong:(NSString *)zSong
{
    NSSet *targets = [self lookUpTitle:zSong];

    if ([targets count] > 0) {
        [self.masterSongs minusSet:targets];

        for (Playlist *playlist in self.listOfPlaylists) {
            // -allObjects converts the set into an array.
            [playlist.songLists removeObjectsInArray:[targets allObjects]];
        }
    }
}

你问了一个关于属性的新问题。

@property (copy) NSMutableSet *masterSongs;

是个坏主意。自动生成-setMasterSongs:方法,如下所示:

- (void)setMasterSongs:(NSMutableSet *)masterSongs
{
    if (_masterSongs != masterSongs) {
        _masterSongs = [masterSongs copy];
    }
}

问题是-[NSMutableSet copy]返回NSSet;同样,-[NSMutableArray copy]会返回NSArray。这就是你遇到问题的原因。 NSSetNSArray是不可变的,因此它们不包含任何会改变其内容的方法。