Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C快速计数故障_Objective C_Cocoa_Fast Enumeration - Fatal编程技术网

Objective c 目标C快速计数故障

Objective c 目标C快速计数故障,objective-c,cocoa,fast-enumeration,Objective C,Cocoa,Fast Enumeration,我试图使用快速枚举打印播放列表中的所有歌曲,但似乎我做得不对。有人能帮我吗? 我定义了这样一个歌曲类: @interface Song : NSObject @property (nonatomic,strong) NSString *title; @property (nonatomic,strong) NSString *artist; @property (nonatomic,strong) NSString *album; @property (nonatomic,strong) NSS

我试图使用快速枚举打印播放列表中的所有歌曲,但似乎我做得不对。有人能帮我吗? 我定义了这样一个歌曲类:

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

您永远不会创建播放列表

在Playlist类'init'中添加一个
Playlist=[[NSMutableArray alloc]init]

并考虑使用播放列表的属性(人-类似的名字非常讨厌!)

如果您不想拥有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];
    }
    
    如果您想确保消息被理解,不管它是什么对象


您永远不会创建播放列表

在Playlist类'init'中添加一个
Playlist=[[NSMutableArray alloc]init]

并考虑使用播放列表的属性(人-类似的名字非常讨厌!)

如果您不想拥有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];
    }
    
    如果您想确保消息被理解,不管它是什么对象


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

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

“不起作用”是什么意思?请更明确地说明您的预期和实际结果。“不起作用”是什么意思?请更明确地说明您的预期和实际结果。:D这也是我对实际问题的猜测!(一周内出现多少次?)不止一次。但这是可以理解的,因为向nil发送消息并不是一个错误。感谢您的快速回复,我没有注意到:)您考虑播放列表的属性是什么意思?我更喜欢使用属性而不是普通成员。在这种情况下,我可能会使用一个私有属性,在类扩展中声明:D这也是我对实际问题的猜测!(一周内出现多少次?)不止一次。但这是可以理解的,因为向nil发送消息并不是一个错误。感谢您的快速回复,我没有注意到:)您考虑播放列表的属性是什么意思?我更喜欢使用属性而不是普通成员。在本例中,我可能使用私有属性,在类扩展中声明