2012-03-04 74 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方法來懶惰地在您的方法中執行操作。