Назад к задачам
Junior — Senior
10

Создать менеджер для объединения треков из нескольких альбомов

Компании, где спрашивали:

Т-БанкТ-Банк
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Необходимо реализовать менеджер, который собирает списки треков из разных альбомов и выводит объединённый результат.

struct Song: CustomStringConvertible {
    let title: String
    var description: String { title }
}

protocol AlbumProvider {
    func loadSongs(albumId: String, completion: @escaping ([Song]) -> Void)
}

final class AlbumService: AlbumProvider {
    func loadSongs(albumId: String, completion: @escaping ([Song]) -> Void) {
        DispatchQueue.global().async {
            let songs: [Song]
            switch albumId {
            case "1":
                songs = [
                    Song(title: "One, 1"),
                    Song(title: "Two, 1"),
                    Song(title: "Three, 1"),
                    Song(title: "Four, 1")
                ]
            case "2":
                songs = [
                    Song(title: "One, 2"),
                    Song(title: "Two, 2"),
                    Song(title: "Three, 2")
                ]
            case "3":
                songs = [
                    Song(title: "One, 3"),
                    Song(title: "Two, 3")
                ]
            default:
                songs = []
            }

            DispatchQueue.main.asyncAfter(deadline: .now() + Double.random(in: 0.1...0.4)) {
                completion(songs)
            }
        }
    }
}

final class SongsManager {
    let albumService = AlbumService()

    func loadSongs(albumIds: [String], completion: @escaping ([Song]) -> Void) {
        // Реализуйте загрузку треков из всех переданных альбомов и верните единый массив
        // Написать код
    }
}

let manager = SongsManager()
let albumIds: [String] = ["1", "2", "3"]

manager.loadSongs(albumIds: albumIds) { songs in
    // вывести объединённый список треков
    print(songs)
}

RunLoop.main.run(until: Date(timeIntervalSinceNow: 3))