新手问题,
我有 3 Class ,其中3个是NSObject的子类
一个。集合类
这个类将有2个属性
湾播放列表类
此类将具有2个属性
℃。歌曲类
此类有4个属性声明为NSString:
问题:
* 我正在使用查找方法创建一个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{
;
}
}
答案 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
。这就是你遇到问题的原因。 NSSet
和NSArray
是不可变的,因此它们不包含任何会改变其内容的方法。