在没有初始化的情况下进行结构初始化时的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成为var,而不是let,我希望它保持不变。另一方面,我可以继续使用自动生成的初始化程序。

问题:

  1. 我还有什么其他可能性?
  2. 如果没有,那么两个方法中哪一个最好?
cisya 回答:在没有初始化的情况下进行结构初始化时的Swift初始化属性

这听起来是使用计算属性的绝佳机会:

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

尽管它被声明为var,但是您实际上无法设置它。这就是必须声明计算属性的方式。

每次使用该属性时,表达式AllCategories.categories[category]?[subcategory] ?? "❌"都会被求值。这不是一个太耗时的表达,因此IMO很好。

本文链接:https://www.f2er.com/3133082.html

大家都在问