删除和添加相同的对象到不同的类

时间:2012-08-09 20:03:47

标签: objective-c

我正在读一本书来学习Objective-C。我陷入其中一个练习中。你必须制作一个包含课堂歌曲,播放列表和音乐收藏的节目。如果您创建一首歌曲,它必须自动添加到音乐集合中,该集合具有用于收集歌曲的NSMutableArray。如果从音乐集中删除对象,则必须从包含该歌曲的每个播放列表中删除该歌曲。

歌曲界面

#import <Foundation/Foundation.h>

    @interface Song : NSObject{

    NSString *title;
    NSString *artist;
    NSString *album;
    }

    @property (copy) NSString  *title;
    @property (copy) NSString  *artist;
    @property (copy) NSString  *album;

    -(Song *) initWithNames:(NSString*) title1 and: (NSString*) artist1 and: (NSString*) album1;

    @end

播放列表界面

#import <Foundation/Foundation.h>

@interface Playlist : NSObject{
    NSString * title;
    NSMutableArray *collecsongs;
}

@property (strong) NSString *title; 
@property (strong) NSMutableArray *collecsongs;

-(Playlist *) initWithName: (NSString *) name;

@end

音乐收藏界面

#import <Foundation/Foundation.h>
#import "Playlist.h"

@interface MusicCollection : NSObject{
    NSMutableArray *collecplist;
    Playlist *library;
}

@property (strong) NSMutableArray *collecplist;
@property (strong) Playlist *library;


@end

因此,如果我创建一首歌曲,例如song1,如果我将其添加到播放列表中,有没有办法将其自动添加到mastercoleection变量“library”中,而不是这样做

Song *song1 = [[Song alloc] initWithNames:@"Somebody That I Used To Know" and: @"Gotye" and: @"First Album"];

Playlist *Misrolas = [[Playlist alloc] initWithName: @"Misrolas"];

MusicCollection *music = [[MusicCollection alloc] init];        

[Misrolas.collecsongs addObject: song1];//adds song1 to the playlist named "Misrolas"
[music.library.collecsongs addObject: song1];//adds song1 to the music collection

所以我不知道该怎么做,我在考虑覆盖可能addObject:,但这似乎并不容易,感谢帮助=)

我是这样做的,是否有更有效或更好的方法来添加它?

-(void) addsong: (Song *)song addtocollection: (Playlist *) library{

    NSAssert([song isKindOfClass: [Song class]], @"Not the same class");

        [self.collecsongs addObject:song];
        [library.collecsongs addObject: song];

}

2 个答案:

答案 0 :(得分:0)

如果您在Playlist对象上调用方法来添加歌曲,而不是访问其collecsongs属性,您可能会发现这更容易。在该方法中,它可以将歌曲添加到数组中,然后将其添加到库中。 (然后你可以让collecsongs属性返回NSArray,而不是NSMutableArray,这对我来说似乎更清晰。

答案 1 :(得分:0)

-(Song *) initWithNames:(NSString*) title1 and: (NSString*) artist1 and: (NSString*) album1;

这是一个非常糟糕的命名。您的选择器缩短为initWithNames:和:and :(这不是真正描述性的)。考虑使用

- (id)initWithTitle:(NSString *)title artist:(NSString *)artist album:(NSString *)album;

注意我在这里使用返回类型(id)。它允许更容易的子类化,因为任何后代类都可以使用init ...&#34; constructor&#34;没有任何类型的不匹配警告。

说到你的问题,我建议你只公开NSArray *属性访问器(以便你不能修改数组内容)并在播放列表类上创建一个方法:

- (void)addSong:(Song *)song
{
    NSAssert([song isKindOfClass:[Song class]]);
    [self.collecplist addObject:song];
}

OOP的封装正在进行中。你没有公开私人界面(数组),你提供了准确添加歌曲的界面(你不能添加其他类型的对象),最后,你做了一个验证,你添加的是一首歌。在这里,您还可以将歌曲添加到音乐收藏中。