Быстрое свойство инициализации при инициализации структуры без инициализатора - PullRequest
2 голосов
/ 09 ноября 2019

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

Вопросы:

  1. Какие еще у меня есть возможности?
  2. Если их нет, то какиеиз 2 подходов самый лучший?

1 Ответ

2 голосов
/ 09 ноября 2019

Звучит как отличный шанс использовать вычисленные свойства:

var emoji: Character {
     AllCategories.categories[category]?[subcategory] ?? "❌"
}

Хотя оно объявлено как var, вы не можете его установить. Это просто, как вычисляемые свойства должны быть объявлены.

Выражение AllCategories.categories[category]?[subcategory] ?? "❌" будет оцениваться каждый раз, когда вы используете свойство. Это не слишком трудоемкое выражение, так что, IMO, все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...