Как определить значение универсальной переменной во время выполнения? - PullRequest
0 голосов
/ 26 августа 2018

В следующем фрагменте показана общая переменная 'A'.

Я пытаюсь выяснить источник nil, возвращаемый этой загрузкой ().

Вот фрагмент кода:

final class Cache {
    var storage = FileStorage()

    // 1) 'load': Read from the Cache:
    func load<A>(_ resource: Resource<A>) -> A? {
        print("--- LOAD ---")
        guard case .get = resource.method else { return nil }
        // Type of 'data' is optional.
        let diskData = storage[resource.cacheKey] // ...type: Data? (optional-Data).
        // Want to convert diskData to A? (optional-A):
        return diskData.flatMap(resource.parse) // ...cleaning data, removing nils.
    }

    // 2) 'save' to the Cache:
    func save<A>(_ data: Data, for resource: Resource<A>) {
        print("--- SAVE ---")
        guard case .get = resource.method else { return }
        self.storage[resource.cacheKey] = data
    }
}

// ----------------------------------

// MARK: -  Resource

public struct Resource<A> {
    public var url: URL
    public var parse: (Data) -> A? // ... convert Data to A?
    public var method: HttpMethod<Data> = .get

    public init(url: URL, parse: @escaping (Data) -> A?, method: HttpMethod<Data> = .get) {
        self.url = url
        self.parse = parse
        self.method = method
    }
}

// ----------------------------------

А пока, как я могу определить значение любой универсальной переменной во время выполнения отладки?

То есть, кому я могу определить значение A?

Примечание: код взят из общего источника через 'Swift Talk' на objc.io.

enter image description here enter image description here

1 Ответ

0 голосов
/ 26 августа 2018

Чтобы узнать, какой тип A представляет, выведите тип переменной, тип которой включает заполнитель универсального типа.

В вашем случае resource имеет тип Resource<A>, поэтому:

p type(of: resource)

покажет что-то вроде:

<ProjectName>.Resource<Int>

, в этом случае A равно Int.

...