0

高速列挙を使用してプレイリストにあるすべての曲を印刷しようとしていますが、間違っているようです。誰かが私を助けてくれますか?私はこのような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メソッドが優れていますか?

4

2 に答える 2

3

プレイリストを作成することはありません

プレイリストクラスのinitに追加しますplaylist = [[NSMutableArray alloc] init] ;

そして、プレイリストにプロパティを使用することを検討してください(男—似たような名前はかなり迷惑です!)

initが必要ない場合は、次のこともできます。

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

2番目の質問に答える:それは依存します

  • 配列にSongのインスタンスしかないことがわかっている場合は、2番目のバージョンの方が少し高速です。

  • わからない場合は、それが最初です。そうでない場合、オブジェクトはメッセージを受信するため、処理できません->クラッシュ

  • またはあなたがすることができます

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

    確認したい場合は、メッセージがどのオブジェクトであっても、メッセージが理解されていることを確認してください。

于 2012-03-04T22:19:18.037 に答える
1

プレイリスト配列を初期化していないようです。nil をチェックするか、PlayList クラスの init メソッドをオーバーライドすることにより、メソッドでこれを遅延して行うことができます。

于 2012-03-04T22:21:41.420 に答える