Кеширование в Swift 4.2 с помощью PromiseKit 6

Я испытываю две ошибки:

pending = endpoint().then { freshValue in

Вызывает ошибку: "Невозможно определить тип возвращаемого значения сложного замыкания; добавить явный тип для устранения неоднозначности"

return Guarantee(cachedValue) as! Guarantee<t>

Вызывает ошибку: "Не удается преобразовать значение типа" T "в ожидаемый тип аргумента" PMKUnambiguousInitializer ""

Это работало в Swift 2 (немного отредактировано с тех пор), однако после обновления до Swift 4.2 этот код начинает ломаться. Я признаю, я все еще пытаюсь выяснить все изменения от Promisekit 4 до 6.

Вот остальная часть кода:

import Foundation
import PromiseKit

class CachedValue<T> {
    var date = NSDate.distantPast
    var value: T? { didSet { date = NSDate() as Date } }
}

class Cache<T> {
    private let defaultMaxCacheAge: TimeInterval
    private let defaultMinCacheAge: TimeInterval
    private let endpoint: () -> Guarantee<T>
    private let cached = CachedValue<T>()
    private var pending: Guarantee<T>?

    // Always makes API request, without regard to cache
    func fresh() -> Guarantee<T> {
        // Limit identical API requests to one at a time
        if pending == nil {
            pending = endpoint().then { freshValue in
                self.cached.value = freshValue
                return Promise(freshValue)
            }.ensure {
                self.pending = nil
            } as! Guarantee<T>
        }
        return pending!
    }

    // If cache too old (invalid), returns nil
    func cachedOrNil(maxCacheAge: TimeInterval) -> T? {
        // maxCacheAge is maximum cache age before cache is deleted
        if NSDate().timeIntervalSince(cached.date) > maxCacheAge {
            cached.value = nil
        }
        return cached.value
    }

    // If cache nil too old (stale), makes API request
    func cachedOrFresh(maxCacheAge: TimeInterval, minCacheAge: TimeInterval) -> Guarantee<T> {
        // minCacheAge is minimum cache age before API request is made
        if let cachedValue = cachedOrNil(maxCacheAge: maxCacheAge) {
            if NSDate().timeIntervalSince(cached.date) < minCacheAge {
                return Guarantee(cachedValue) as! Guarantee<T>
            }
        }
        return fresh()
    }
    /// ... More code in file...
}

1 ответ

Решение

Здесь вам необходимо указать тип возврата из then блок, указав конкретный тип, например, MyClass как показано ниже,

pending = endpoint().then { freshValue -> Guarantee<MyClass> in ...}
Другие вопросы по тегам