Во-первых, я должен указать, что ваша попытка сделать что-то совершенно отличное от того, что вы сказали, что хотите сделать в первом абзаце.
Если мы 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)
}
}