【问题标题】:Objective C fast enumeration troubleObjective C快速枚举麻烦
【发布时间】:2012-03-22 11:50:21
【问题描述】:

我正在尝试使用快速枚举来打印播放列表中的所有歌曲,但似乎我做错了。有人可以帮我吗? 我已经定义了一个这样的 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 方法比较好?

【问题讨论】:

  • “不工作”是什么意思?请更明确地说明您的预期和实际结果。

标签: objective-c cocoa fast-enumeration


【解决方案1】:

您永远不会创建播放列表

在 Playlist 类的 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];
    }
    

    如果您想确定,无论它是什么对象,都可以理解该消息。

【讨论】:

  • :D 这也是我对实际麻烦的猜测! (一周内会出现多少次?)
  • 不止一次。但这是可以理解的,因为向 nil 发送消息并不是错误。
  • 感谢您的快速回复,我没注意到 :)
  • 考虑播放列表的属性是什么意思?
  • 我更喜欢使用属性而不是普通成员。在这种情况下,我可能会使用在类扩展中声明的私有属性
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多