【发布时间】:2020-03-05 19:25:39
【问题描述】:
在 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初始化之后赋值。
我应该如何在代码中做到这一点?
方法一:
提供我自己的初始化程序
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] ?? "❌"
}
我不喜欢这种方法,因为它添加了许多不必要的代码,这些代码只有在我添加更多属性时才会增长……我想使用生成的结构初始化程序。另一方面,代码还是很简单的。
方法二:
使用仅在调用时计算的lazy var。
lazy var emoji: Character = {
AllCategories.categories[category]?[subcategory] ?? "❌"
}()
我也不太喜欢这种方法,我发现它对于我想要做的事情来说过于复杂。这也使得emojia var而不是let它不是,我希望它保持不变。另一方面,我可以继续使用自动生成的初始化程序。
问题:
- 我还有什么其他可能性?
- 如果没有,这两种方法中哪一种最好?
【问题讨论】:
-
虽然我倾向于将@Sweeper 的答案与计算属性一起使用,但使用
lazy var并没有什么特别的错误——Apple 在关于初始化的 Swift 文档中提到以这种方式使用它。
标签: swift struct initialization