protocol CacheProtocol {

Это generic-кеш на Dictionary: T становится associatedtype Value, присваивание nil удаляет ключ. fetchValue вызывает completion синхронно, несмотря на название.

Короткий ответ

Что ответить на собеседовании

Это 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее