Objective C快速枚举麻烦

时间:2012-03-04 22:16:36

标签: objective-c cocoa fast-enumeration

我正在尝试使用快速枚举来打印播放列表中的所有歌曲,但似乎我做错了。有人可以帮帮我吗? 我已经定义了一个这样的Song类:

@interface Song : NSObject
@property (nonatomic,strong) NSString *title;
@property (nonatomic,strong) NSString *artist;
@property (nonatomic,strong) NSString *album;
@property (nonatomic,strong) NSString *playtime;
-(void) displaySong;
@end

displaySong函数如下所示:

-(void) displaySong {
NSLog(@"%@ - %@ [%@] - %@\n", artist, title, album, playtime);
}

现在,到PlayList类:

@interface PlayList : NSObject{
NSString *name;
NSMutableArray *playlist;
}
-(void) addSongToPlaylist: (Song *) song;
-(void) displayPlaylist;
@end

@implementation PlayList
-(void) addSongToPlaylist: (Song *) nameOfSong{
    [playlist addObject:nameOfSong];
}

-(void) displayPlaylist{
NSLog(@"Playlist called %@:\n", name);
for(id obj in playlist)
{
    if([obj isKindOfClass:[Song class]])
    [obj displaySong];
}
}

// I also tried the displayPlaylist method this way, but it wasn't working either
-(void) displayPlaylist{
NSLog(@"Playlist called %@:\n", name);
for(Song *song in playlist)
{
    [song displaySong];
}

@end

有人可以向我解释为什么我的代码不起作用吗? 什么displayPlaylist方法更好?

2 个答案:

答案 0 :(得分:3)

您永远不会创建播放列表

在播放列表类'init中添加playlist = [[NSMutableArray alloc] init] ;

考虑使用播放列表的属性(男人 - 相似的名字非常烦人!)

如果你不想拥有一个init,你也可以这样做:

-(void) addSongToPlaylist: (Song *) nameOfSong{
    if(!playlist)
        playlist= [[NSMutableArray alloc] init];
    [playlist addObject:nameOfSong];
}

回答第二个问题:这取决于

  • 如果你知道,数组中只有Song的实例,第二个版本更好,速度更快

  • 如果你不知道,那是第一个,否则一个对象会收到一条消息,它无法处理 - >碰撞

  • 或者你可以做

    for(id obj in playlist)
    {
        if([obj respondsToSelector:@selector(displaySong)])
        [obj displaySong];
    }
    

    如果你想确定,无论它是什么对象,都能理解消息。

答案 1 :(得分:1)

您似乎没有初始化播放列表数组。您可以通过检查nil或覆盖PlayList类的init方法来懒散地在您的方法中执行此操作。