Я пытаюсь практиковать дженерики, поэтому, вероятно, я пропустил что-то очевидное и мне может понадобиться помощь.
enum CacheTime {
case short
case long
}
struct Cached<T: Equatable> {
let object: T
let type: CacheTime
init(_ object: T, type: CacheTime) {
self.object = object
self.type = type
}
}
Затем я хочу использовать этот тип с фактическим конкретным типом в качестве свойства. Я думал, что смогу сделать:
struct Holder {
var people: Cached<[Person]> = []
}
Я получаю сообщение об ошибке, что не может преобразовать значение типа [Any]
в указанный тип Cached<[Person]>
. Есть предположения?
Вы инициализируете people
как массив, который не является. Ожидается, что кэшированный объект будет выглядеть примерно так
Cached([Person](), type: .short))
Чтобы сократить код, вы можете использовать propertyWrapper
s. Ваша структура Cached
будет:
@propertyWrapper
struct Cached<T: Equatable> {
var wrappedValue: T
let type: CacheTime
init(wrappedValue: T, type: CacheTime) {
self.wrappedValue = wrappedValue
self.type = type
}
}
И используйте это так:
struct Holder {
@Cached<[Person]>(type: .short) var people = []
}