ObjC - одновременный #import и @class одного класса
Никита Тепляков

Читаю Стивена Кочана, 9 задание 15 главы:
Определите 3 класса - Song, Playlist, MusicCollection.
Класс Song включает разные поля - имя, исполнитель, время трека и т.п.
Класс Playlist является коллекцией объектов Song
Класс MusicCollection включает коллекцию Playlist-ов и коллекцию треков (library) из этих Playlist-ов + отдельно объекты Song.
При добавлении объектов Song в Playlist, они должны добавляться в library (если playlist находится в коллекции MusicCollection).
Проблема в том, что в классе MusicCollection вылезает ошибка, "Expected a type", если добавить #import "Playlist" и не добавлять @class Playlist;
Если же добавить только @class, то естесственно вылетает куча ошибок.
Вопрос в том, зачем при импорте ему нужно добавлять еще и диррективу @class?
Вот код:

Класс Song:

import <Foundation/Foundation.h>

@interface GBSong : NSObject

@property (nonatomic, copy) NSString *title, *artist, *album;
@property (nonatomic) int playingTime;

  • (instancetype) initWithTitle:(NSString *)theTitle artist:(NSString *)theArtist album:(NSString *)theAlbum andPlayngTime:(int)theTime;

@end

@implementation GBSong

@synthesize title, artist, album, playingTime;

  • (instancetype) initWithTitle:(NSString *)theTitle
    artist:(NSString *)theArtist
    album:(NSString *)theAlbum
    andPlayngTime:(int)theTime
    {
    self = [super init];
    if (self) {
    self.title = theTitle;
    self.artist = theArtist;
    self.album = theAlbum;
    self.playingTime = theTime;
    }
    return self;
    }

  • (instancetype) init
    {
    return [self initWithTitle:@"NoTitle" artist:@"NoArtist" album:@"NoAlbum" andPlayngTime:0];
    }

@end

Класс Playlist

import <Foundation/Foundation.h>

import "GBMusicCollection.h"

@class GBSong;

@interface GBPlaylist : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSMutableArray *playlist;
@property (nonatomic, strong) NSMutableArray *owners;

  • (instancetype) initWithName:(NSString *)theName;

  • (void) addSong:(GBSong *)theSong;

  • (void) removeSong:(GBSong *)theSong;

@end

@implementation GBPlaylist

@synthesize name, playlist, owners;

  • (instancetype) initWithName:(NSString *)theName
    {
    self = [super init];
    if (self) {
    self.name = theName;
    self.playlist = [NSMutableArray array];
    self.owners = [NSMutableArray array];
    }
    return self;
    }

  • (instancetype) init
    {
    return [self initWithName:@"NoName"];
    }

  • (void) addSong:(GBSong *)theSong
    {
    for (GBMusicCollection *nextObject in self.owners) {
    [nextObject.library addObject:theSong];
    }
    [self.playlist removeObject:theSong];
    [self.playlist addObject:theSong];
    }

  • (void) removeSong:(GBSong *)theSong
    {
    [self.playlist removeObject:theSong];
    }
    @end

Класс MusicCollection:

import "GBPlaylist.h"

@class GBPlaylist;
@class GBSong;

@interface GBMusicCollection : NSObject

@property (nonatomic, strong) NSMutableArray *musicCollection, *library;

  • (void) addPlaylist:(GBPlaylist *)thePlaylist;
  • (void) removePlaylist:(GBPlaylist *)thePlaylist;

  • (void) addSong:(GBSong *)theSong;

  • (void) removeSong:(GBSong *)theSong;

@end

import "GBMusicCollection.h"

@implementation GBMusicCollection

@synthesize musicCollection, library;

  • (instancetype) init
    {
    self = [super init];
    if (self) {
    self.musicCollection = [NSMutableArray array];
    self.library = [NSMutableArray array];
    }
    return self;
    }

  • (void) addPlaylist:(GBPlaylist *)thePlaylist
    {
    [thePlaylist.owners addObject:self];
    [self.library removeObjectsInArray:thePlaylist.playlist];
    [self.library addObjectsFromArray:thePlaylist.playlist];
    [self.musicCollection addObject:thePlaylist];
    }

  • (void) removePlaylist:(GBPlaylist *)thePlaylist
    {
    [thePlaylist.owners removeObject:self];
    [self.library removeObjectsInArray:thePlaylist.playlist];
    [self.musicCollection removeObject:thePlaylist];
    }

  • (void) addSong:(GBSong *)theSong
    {
    [self.library removeObject:theSong];
    [self.library addObject:theSong];
    }

  • (void) removeSong:(GBSong *)theSong
    {
    [self.library removeObject:theSong];
    for (GBPlaylist *nextPlaylist in self.musicCollection) {
    [[nextPlaylist playlist] removeObject:theSong];
    }
    }

@end

1 чел.