2012-03-04 70 views
0

我试图用快速枚举来打印播放列表中的所有歌曲,但似乎我做错了。有人可以帮我吗? 我已经定义了一个宋级是这样的:Objective C快速枚举问题

@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); 
} 

,现在,到了播放列表类:

@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方法更好?

+0

“不工作”是什么意思?请更加明确您的预期和实际结果。 – 2012-03-04 22:19:40

回答

3

你永远在播放列表类的创建播放列表

INIT添加playlist = [[NSMutableArray alloc] init] ;

,并考虑使用属性的播放列表(人 - 类似的名称是很烦人)

如果您不希望有一个初始化,你也可以这样做:

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

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

  • ,如果你知道,只有歌的实例阵列中,第二个版本是更好,因为有点快

  • ,如果你不“知道,它是第一个,否则一个对象将收到一条消息,它不能处理 - >崩溃

  • ,或者你可以做

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

    如果你想确定消息是否可以理解,不管它是什么对象。

+0

:D这是我对于实际麻烦的猜测! (这一星期出现多少次?) – 2012-03-04 22:21:22

+0

不止一次。但可以理解的是,向nil发送消息不是错误。 – vikingosegundo 2012-03-04 22:26:05

+0

感谢您的快速回复,我没有注意到它:) – nemesis 2012-03-04 22:26:42

1

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