Вместо того, чтобы хранить два свойства, для которых установлено только одно, вы можете иметь обобщенный класс c с одним обязательным свойством. Таким образом, вам не нужно проверять, что установлено или не установлено
class Loot<T: Item> {
let item: T
init(item: T) {
self.item = item
}
}
Пример
let loot1 = Loot(item: Armor())
let loot2 = Loot(item: Sword())
Если вы хотите получить доступ к элементу как Armor
или Sword
Я бы предложил добавить вычисляемые свойства в расширение. Лучше добавить их в расширение, так как это не является частью основной функциональности класса, и это также лучший дизайн, если вы создадите другой тип Item
, такой как Shield
, тогда вы можете добавить для него вычисляемое свойство в расширении без необходимости изменения основного класса.
extension Loot {
var armor: Armor? {
get {
guard let armor = item as? Armor else {return nil}
return armor
}
}
var sword: Sword? {
get {
guard let sword = item as? Sword else {return nil}
return sword
}
}
}
Затем вы можете получить к ним доступ как к дополнительным
if let armor = loot1.armor {
//do armor stuff
}