0

Objective-C を学ぶために本を読んでいます。演習の 1 つに行き詰まっています。クラスソング、プレイリスト、音楽コレクションを含むプログラムを作成する必要があります。曲を作成する場合、曲を収集するための NSMutableArray を持つ音楽コレクションに自動的に追加する必要があります。また、音楽コレクションからオブジェクトを削除すると、その曲を含むすべてのプレイリストから曲を削除する必要があります。

ソングインターフェース

#import <Foundation/Foundation.h>

    @interface Song : NSObject{

    NSString *title;
    NSString *artist;
    NSString *album;
    }

    @property (copy) NSString  *title;
    @property (copy) NSString  *artist;
    @property (copy) NSString  *album;

    -(Song *) initWithNames:(NSString*) title1 and: (NSString*) artist1 and: (NSString*) album1;

    @end

プレイリスト インターフェイス

#import <Foundation/Foundation.h>

@interface Playlist : NSObject{
    NSString * title;
    NSMutableArray *collecsongs;
}

@property (strong) NSString *title; 
@property (strong) NSMutableArray *collecsongs;

-(Playlist *) initWithName: (NSString *) name;

@end

音楽コレクション インターフェイス

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

@interface MusicCollection : NSObject{
    NSMutableArray *collecplist;
    Playlist *library;
}

@property (strong) NSMutableArray *collecplist;
@property (strong) Playlist *library;


@end

したがって、たとえばsong1の曲を作成する場合、それをプレイリストに追加する方法はありますか?これを行う代わりに、自動的にmastercoleection変数「ライブラリ」に追加します

Song *song1 = [[Song alloc] initWithNames:@"Somebody That I Used To Know" and: @"Gotye" and: @"First Album"];

Playlist *Misrolas = [[Playlist alloc] initWithName: @"Misrolas"];

MusicCollection *music = [[MusicCollection alloc] init];        

[Misrolas.collecsongs addObject: song1];//adds song1 to the playlist named "Misrolas"
[music.library.collecsongs addObject: song1];//adds song1 to the music collection

だから私は何をすべきかわからない、おそらく addObject: をオーバーライドすることを考えていましたが、それは正しく簡単ではないようです、助けてくれてありがとう =)

私はこのようにしていますが、それを追加するためのより効率的またはより良い方法はありますか???

-(void) addsong: (Song *)song addtocollection: (Playlist *) library{

    NSAssert([song isKindOfClass: [Song class]], @"Not the same class");

        [self.collecsongs addObject:song];
        [library.collecsongs addObject: song];

}
4

2 に答える 2

0

Playlistオブジェクトのプロパティにアクセスするのではなく、オブジェクトのメソッドを呼び出して曲を追加すると、おそらくこれが簡単になりcollecsongsます。このメソッドでは、曲を配列に追加してから、ライブラリに追加できます。(そして、collecsongsプロパティが、ではなくNSArrayを返すようにすることができNSMutableArrayます。これは、私にははるかにクリーンに思えます。

于 2012-08-09T20:07:16.837 に答える
0
-(Song *) initWithNames:(NSString*) title1 and: (NSString*) artist1 and: (NSString*) album1;

これはかなり悪いネーミングです。セレクターは initWithNames:and:and: に短縮されます (これはあまり説明的ではありません)。使用を検討してください

- (id)initWithTitle:(NSString *)title artist:(NSString *)artist album:(NSString *)album;

ここで (id) の戻り値の型をどのように使用しているかに注目してください。下位クラスは init... 「コンストラクター」をタイプの不一致の警告なしで使用できるため、サブクラス化が容易になります。

あなたの問題について言えば、NSArray * プロパティ アクセサーのみを公開して (配列の内容を変更できないようにするため)、Playlist クラスでメソッドを作成することをお勧めします。

- (void)addSong:(Song *)song
{
    NSAssert([song isKindOfClass:[Song class]]);
    [self.collecplist addObject:song];
}

これが OOP のカプセル化の動作です。プライベート インターフェイス (配列) を公開せず、曲を正確に追加するためのインターフェイスを提供し (他の種類のオブジェクトを追加することはできません)、最後に、追加したものが実際に曲であることを確認します。ここで、曲を音楽コレクションに追加することもできます。

于 2012-08-09T20:13:19.613 に答える