0

我从 Objective-C 开始,我正在对 MusicCollection 和 Playlists 进行练习。MusicCollection 有一个主播放列表,它将包含其他播放列表中包含的所有歌曲。我不想让用户在不立即将其添加到音乐库的情况下创建播放列表。这样,用户可以创建一个播放列表,然后立即向其中添加歌曲,它将反映在主库中,而无需稍后手动添加。所以这是我在 MusicCollection 中的初始化:

- (id) initWithName: (NSString *)aName
{
    self = [super init];

    if(self)
    {
        name = aName;                             // name of MusicCollection
        collection = [NSMutableArray array];      // array of Playlist objects

        // Now I'm making a playlist which I want to be designated
        // as the master playlist.

        library = [[Playlist alloc] initWithName:@"Library"
                                 underCollection:self];
    }

    return self;
}

现在我不确定 Playlist init 方法中的逻辑。如果尚未创建适当的 MusicCollection,我不想允许用户创建 Playlist 对象。这是我所拥有的:

- (id) initWithName: (NSString *)theName underCollection:(MusicCollection *)theMusic
{
    self = [super init];

    if(self)
    {
        name = theName;
        songs = [NSMutableArray array];

        if([theMusic.collection count] == 0)
        {
            NSLog(@"This is the master playlist");
            [theMusic.collection addObject:self];
        }
        else if([theMusic.collection count] != 0)
        {
            [theMusic.collection addObject:self];
             NSLog(@"Adding a regular playlist");
        }
    }
    return self;
}

这对我来说似乎很冒险。就像用户可以尝试通过调用 Playlist 上的 init 方法来创建一个带有一些未正确初始化的 MusicCollection 的播放列表。有一个更好的方法吗?

4

2 回答 2

2

-init您可以在您的课程中覆盖Playlist

- (id)init
{
    @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Use -initWithName:underCollection: instead" userInfo:nil];
}
于 2013-07-11T03:49:21.350 回答
0

您可以覆盖播放列表的 init 方法并添加这些检查,或者让它抛出异常,以便 init 不能用于制作播放列表。

于 2013-07-11T03:49:23.627 回答