Это generic-кеш на Dictionary: T становится associatedtype Value, присваивание nil удаляет ключ. fetchValue вызывает completion синхронно, несмотря на название.
protocol CacheProtocol {
Это generic-кеш на Dictionary: T становится associatedtype Value, присваивание nil удаляет ключ. fetchValue вызывает completion синхронно, несмотря на название.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
protocol CacheProtocol { associatedtype Value func setValue(_ value: Value?, forKey key: String) func getValue(forKey key: String) -> Value? func fetchValue(forKey key: String, completion: @escaping (Value?) -> Void) }
final class Cache<T>: CacheProtocol { private var storage: [String: T] = [:]
func setValue(_ value: T?, forKey key: String) {
storage[key] = value
}
func getValue(forKey key: String) -> T? {
return storage[key]
}
func fetchValue(forKey key: String, completion: @escaping (T?) -> Void) {
let value = storage[key]
completion(value)
}
}
import XCTest
final class CacheTests: XCTestCase { override func setUp() { super.setUp() }
func testSetAndGetValue() {
let cache = Cache<String>()
let key: String = "key"
let value: String = "value"
cache.setValue(value, forKey: key)
XCTAssertEqual(cache.getValue(forKey: key),
value)
cache.setValue(nil, forKey: key)
XCTAssertTrue(cache.getValue(forKey: key) == nil)
}
}
CacheTests.defaultTestSuite.run()
Ответ
Это generic-кеш на Dictionary: T становится associatedtype Value, присваивание nil удаляет ключ. fetchValue вызывает completion синхронно, несмотря на название.
Тест проверяет запись, чтение и удаление через nil. Стоит добавить чтение отсутствующего ключа, перезапись, независимость ключей и однократный вызов completion. В обычном XCTest-проекте тесты запускает runner, ручной defaultTestSuite.run не нужен.
@escaping разрешает хранить замыкание после возврата функции, но не делает выполнение асинхронным. storage не защищено от конкурентных обращений. Для общего кеша нужна изоляция actor или согласованная блокировка; переход к actor может потребовать async-контракт протокола. Копирование Dictionary не гарантирует глубокую копию ссылочных значений T.