我正在读一本书来学习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];
}
答案 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的封装正在进行中。你没有公开私人界面(数组),你提供了准确添加歌曲的界面(你不能添加其他类型的对象),最后,你做了一个验证,你添加的是一首歌。在这里,您还可以将歌曲添加到音乐收藏中。