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) }
}
enum GeneralLogger
Наша задача - исправить код таким образом, чтобы при добавлении новых логгеров нам не приходилось менять наш пользовательский код.
<aside> ☝️ Сперва попробуйте решить самостоятельно. На такую задачу отводится не больше 20-30 минут при собеседовании на позицию Senior iOS developer.
</aside>
Навык написания кода без использования Xcode не появится сам по себе, если его не оттачивать. На интервью, скорее всего, вам предложат решать задачи и писать код без подсветки синтаксиса и подсказок компилятора. Рекомендую использовать https://code.yandex-team.ru/ или https://coderpad.io
Когда мне попалась эта задача, я начал раскручивать ее с конца.
log(logger: LoggerN, param: N)
внутри GeneralLogger
должен быть шаблонным.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)
}