Задача

public struct A {
    public let value: Int
}

public struct B {
    public let value: String
}

public struct LoggerA {
    public func log(with a: A) {
        print(a.value)
    }
}
public struct LoggerB {
    public func log(with b: B) {
        print(b.value)
    }
}
enum GeneralLogger {
    static func log(logger: LoggerA, param: A) { 
		    logger.log(with: param) 
		}
    static func log(logger: LoggerB, param: B) { 
		    logger.log(with: param) 
		}
    // ... N more same 
    // static func log(logger: LoggerN, param: N)  { logger.log(with: param) }
}

Наша задача - исправить код таким образом, чтобы при добавлении новых логгеров нам не приходилось менять наш пользовательский код.

<aside> ☝️ Сперва попробуйте решить самостоятельно. На такую задачу отводится не больше 20-30 минут при собеседовании на позицию Senior iOS developer.

</aside>

Навык написания кода без использования Xcode не появится сам по себе, если его не оттачивать. На интервью, скорее всего, вам предложат решать задачи и писать код без подсветки синтаксиса и подсказок компилятора. Рекомендую использовать https://code.yandex-team.ru/ или https://coderpad.io


Решение

Когда мне попалась эта задача, я начал раскручивать ее с конца.

enum GeneralLogger {

		// Вариант 1
		static func log<T: Logger>(logger: T, param: T.Param) {
        logger.logging(with: param)
    }
    
    // Вариант 2
    static func log<T>(logger: T, param: T.Param) where T: Logger {
        logger.logging(with: param)
    }