В swift структуры имеют автоматически сгенерированный элементный инициализатор.
Это означает, что следующая структура может быть инициализирована без необходимости писать init.
struct Activity {
let name: String
let desc: String
let category: Category
let subcategory: Subcategory
let emoji: Character
let coordinate: CLLocationCoordinate2D
let creationTime: Date = Date()
let activityTime: Date
let id: UUID = UUID()
var comments: [Comment] = []
}
У меня есть одно свойство с именем emoji
, которое вычисляется подкатегорией. Другими словами, значение для emoji
зависит от значения subcategory
.
Однако это означает, что значение emoji
может быть назначено только после инициализации subcategory
.
Как мне сделать это в коде?
Подход 1:
Предоставить свой собственный инициализатор
init(name: String, desc: String, category: Category, subcategory: Subcategory,
coordinate: CLLocationCoordinate2D, activityTime: Date) {
self.name = name
self.desc = desc
self.category = category
self.subcategory = subcategory
self.coordinate = coordinate
self.activityTime = activityTime
self.emoji = AllCategories.categories[category]?[subcategory] ?? "❌"
}
Мне не нравится этот подход, так как он добавляетмного ненужного кода, который будет только расти, если я добавлю больше свойств ... Я хотел бы использовать сгенерированный инициализатор структуры. С другой стороны, код все еще очень прост.
Подход 2:
Используйте lazy var
, который вычисляется только при вызове.
lazy var emoji: Character = {
AllCategories.categories[category]?[subcategory] ?? "❌"
}()
Я такжемне не очень нравится этот подход, я нахожу его слишком сложным для того, что я пытаюсь сделать. Также это делает emoji
a var
вместо let
, что не является, я хочу, чтобы оно оставалось постоянным. С другой стороны, я могу продолжать использовать автоматически сгенерированный инициализатор.
Вопросы:
- Какие еще у меня есть возможности?
- Если их нет, то какиеиз 2 подходов самый лучший?