快速地,结构具有一个自动生成的成员初始化器。
这意味着可以初始化以下结构,而无需编写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
,我希望它保持不变。另一方面,我可以继续使用自动生成的初始化程序。
问题:
- 我还有什么其他可能性?
- 如果没有,那么两个方法中哪一个最好?