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

Реализовать клиент аналитики с выводом в консоль и записью в файл

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

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

Требуется обеспечить работу сервиса аналитики так, чтобы он мог выводить события в консоль, а также сохранять их в файл на втором экране.

public struct AnalyticsEvent {
    public var name: String
    public var params: [String: String]

    public init(name: String, params: [String: String]) {
        self.name = name
        self.params = params
    }
}

public final class AnalyticsClient {
    public func report(_ event: AnalyticsEvent) { ... }
}
final class Screen1ViewController: UIViewController {
    init(analytics: AnalyticsClient) {
        self.analytics = analytics
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated: animated)
        analytics.report(AnalyticsEvent(name: "screen1_did_appear", params: [:]))
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated: animated)
        analytics.report(AnalyticsEvent(name: "screen1_did_disappear", params: [:]))
    }
}
final class Screen2ViewController: UIViewController {
    init(analytics: AnalyticsClient) {
        self.analytics = analytics
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated: animated)
        analytics.report(AnalyticsEvent(name: "screen2_did_appear", params: [:]))
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated: animated)
        analytics.report(AnalyticsEvent(name: "screen2_did_disappear", params: [:]))
    }
}

Ваша задача – дополнить реализацию AnalyticsClient так, чтобы при вызове report(_:) событие выводилось в консоль, а при работе экрана 2 дополнительно записывалось в файл. Нужно продумать, где хранить путь к файлу, как открывать/закрывать его и обеспечить потокобезопасность, если клиент будет использоваться из разных потоков.