Как я могу автоматически асинхронно установить новое свойство существующей структуры после инициализации? - PullRequest
0 голосов
/ 09 июля 2020

Структура Item, которую я использую, имеет свойство с именем path, которое содержит строку местоположения изображения. Я пытаюсь сделать так, чтобы при создании экземпляра Item изображение автоматически извлекалось и устанавливалось для нового свойства image.

Расширяет путь до go для этот? Кажется, я не могу понять, как это сделать.

extension Item {
    var image: UIImage {
        if self.path == nil {
            return UIImage(named: "default.png")!
        }
        ASYNC_CALL_HERE {
            // need to do something with the image here
        }
    }
}

Или есть способ лучше?

Примечание: Item не моя структура.

1 Ответ

0 голосов
/ 09 июля 2020

Во-первых, я должен указать, что ваша попытка сделать что-то совершенно отличное от того, что вы сказали, что хотите сделать в первом абзаце.

Если мы go по тому, что вы сказали в первом абзаца, вам нужно свойство хранимое , которое инициализируется при инициализации Item. К сожалению, вы не можете добавлять сохраненные свойства в расширения, поэтому вы не можете использовать расширение. Item - это структура, поэтому вы не можете создать ее подкласс. Единственный вариант, который я вижу, - это создать класс-оболочку:

class ItemWrapper {
    let item: Item
    var image: UIImage?
    init(<insert parameters of Item.init>) {
        item = Item(<insert parameters of Item.init>)
        if item.path == nil {
            image = UIImage(named: "default.png")!
        } else {
            ASYNC_CALL_HERE { fetchedImage in
                image = fetchedImage
            }
        }
    }
}

Однако, если это не обязательно должно быть сохраненное свойство, мы можем использовать подход, аналогичный тому, который был в вашей попытке . Вместо того, чтобы получать изображение сразу после инициализации Item, мы получаем его только тогда, когда оно нужно вызывающему. Для этого мы могли бы использовать расширение, чтобы добавить метод под названием getImage. Возможно, вы захотите использовать словарь, хранящийся где-то (или что-то еще) в качестве кеша, для имитации сохраненного свойства.

func getImage(completion: @escaping (UIImage) -> Void) {
    guard let path = item.path else {
        completion(UIImage(named: "default.png")!)
        return
    }
    if let image = getImageFromCache(item.path!) {
        completion(image)
        return
    }
    ASYNC_CALL_HERE { fetchedImage in
        completion(fetchedImage)
        storeImageInCache(fetchedImage, path)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...