如何在Objective-C中实现递归方法

时间:2014-01-29 16:44:13

标签: iphone objective-c pointers recursion

我目前正在尝试Stephen Kochan编写的“Objective-C编程”第9章练习9。以下是练习的说明:定义三个新类,分别称为Song,Playlist和MusicCollection。歌曲对象将包含有关特定歌曲的信息,例如标题,艺术家,专辑和播放时间。播放列表将包含播放列表的名称和歌曲集合。 MusicCollection对象将包含一组播放列表,包括一个名为库的特殊主播放列表,其中包含集合中的每首歌曲。定义这三个类并编写方法来执行以下操作: - 创建一个Song对象并设置其信息 - 创建播放列表对象,并将歌曲添加到播放列表中删除歌曲。如果主歌曲播放列表尚未添加,则应将新歌曲添加到主播放列表中。确保如果从主播放列表中删除了一首歌曲,它也会从音乐收藏中的所有播放列表中删除

这是我的main.m和playlist.m(假设所有其他文件都正常运行)

#import <Foundation/Foundation.h>
#import "Song.h"
#import "Playlist.h"
#import "MusicCollection.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSString *aTitle = @"Days to Come";
        NSString *aArtist = @"Seven Lions";
        NSString *aAlbum = @"Seven Lions-EP";
        NSString *aPlaytime = @"4:44";
        NSString *bTitle = @"Red Lights";
        NSString *bArtist = @"Tiesto";
        NSString *bAlbum = @"Red Lights";
        NSString *bPlaytime = @"4:24";
        NSString *cTitle = @"Pressure-Alesso Remix";
        NSString *cArtist = @"Nadia Ali";
        NSString *cAlbum = @"Pressure (The Remixes)";
        NSString *cPlaytime = @"6:06";
        NSString *dTitle = @"Neon - Club Mix";
        NSString *dArtist = @"Sander Van Doorn";
        NSString *dAlbum = @"Neon";
        NSString *dPlaytime = @"5:59";
        NSString *eTitle = @"Into the Light";
        NSString *eArtist = @"Mako";
        NSString *eAlbum = @"Into the Light-Single";
        NSString *ePlaytime = @"6:18";

        Song *single1 = [[Song alloc] init];
        Song *single2 = [[Song alloc] init];
        Song *single3 = [[Song alloc] init];
        Song *single4 = [[Song alloc] init];
        Song *single5 = [[Song alloc] init];

        [single1 setTitle: aTitle andArtist: aArtist];
        [single1 setAlbum: aAlbum andTime: aPlaytime];
        [single2 setTitle: bTitle andArtist: bArtist];
        [single2 setAlbum: bAlbum andTime: bPlaytime];
        [single3 setTitle: cTitle andArtist: cArtist];
        [single3 setAlbum: cAlbum andTime: cPlaytime];
        [single4 setTitle: dTitle andArtist: dArtist];
        [single4 setAlbum: dAlbum andTime: dPlaytime];
        [single5 setTitle: eTitle andArtist: eArtist];
        [single5 setAlbum: eAlbum andTime: ePlaytime];

        MusicCollection *myMusic = [[MusicCollection alloc] initWithName: @"myMusic"];

        Playlist *masterplay = [[Playlist alloc] initWithName: @"library"];

        [myMusic addPlaylist: masterplay];

        Playlist *playlist1 = [[Playlist alloc] initWithName: @"Playlist 1"];
        Playlist *playlist2 = [[Playlist alloc] initWithName: @"Playlist 2"];


        [masterplay addSong: single1];
        [masterplay addSong: single2];
        [masterplay addSong: single3];
        [masterplay addSong: single4];
        [masterplay addSong: single5];

        [playlist1 addSong: single3];
        [playlist1 addSong: single4];

        [playlist2 addSong: single5];

        [masterplay list];


    }
    return 0;
}

//这是Playlist.m

#import "Playlist.h"


@implementation Playlist

@synthesize playListName, fulllist;

-(id) initWithName: (NSString *) name
{
    self = [super init];
    if (self) {
        playListName = [NSString stringWithString: name];
        fulllist = [NSMutableArray array];
    }
    return self;
}
-(void) addSong: (Song *) theSong
{        

    if (![fulllist containsObject: theSong])  
    {   
    [fulllist addObject: theSong];
    }

}
-(void) list
{    
    for (Song *theSong in fulllist){
        NSLog (@"%-20s    %-32s", [theSong.title UTF8String], [theSong.artist UTF8String]);
        NSLog (@"%-20s    %-32s", [theSong.album UTF8String], [theSong.playtime UTF8String]);
    }
}

-(void) removeSong: (Song *) theSong
{
    [fulllist removeObjectIdenticalTo:theSong];
}




@end

正如你在main.m中看到的那样,我将一首歌曲添加到库中,然后再添加到另一个播放列表中。如何更改我的addSong方法,以便在将歌曲添加到另一个播放列表之前自动将歌曲添加到库中(如果它尚未存在)?类似地,如何更改我的removeSong方法,以便它从任何播放列表中自动删除特定歌曲(如果从库中删除)?

0 个答案:

没有答案