import Foundation import UIKit protocol Processor { func process() -> [String] } protocol Loggable { func log() } class BaseProcessor {} class Result {} class DataProcessor: BaseProcessor, Processor { private var items: [String] = [] var current: Result = Result() init() {} deinit {} func addItem(_ item: String) { items.append(item) } func process() -> [String] { return validate(items) } func run(input: DataProcessor) -> Result { return current } private func validate(_ data: [String]) -> [String] { return data.filter { !$0.isEmpty } } } struct Config { let baseUrl: String let timeout: Int subscript(key: String) -> String? { return nil } } enum NetworkError { case timeout case connectionFailed case unauthorized case failed(Config) func describe() -> String { return "error" } } actor CacheManager { private var store: [String: String] = [:] func get(_ key: String) -> String? { return store[key] } } extension DataProcessor: Loggable { func log() { print("logging") } } extension Config { func isValid() -> Bool { return !baseUrl.isEmpty } } func createProcessor() -> DataProcessor { return DataProcessor() }