Swift 在结构初始化时初始化 属性 不初始化
Swift initialise property at struct initialisation without initialiser
在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] ?? "❌"
}()
我也不太喜欢这种方法,我发现它对于我想要做的事情来说过于复杂。这也使得 emoji
a var
而不是 let
而不是,我希望它保持不变。另一方面,我可以继续使用自动生成的初始化程序。
问题:
- 我还有哪些其他可能性?
- 如果有none,2个方法中哪个最好?
这听起来是使用计算属性的好机会:
var emoji: Character {
AllCategories.categories[category]?[subcategory] ?? "❌"
}
虽然它被声明为 var
,但您实际上无法设置它。这就是必须声明计算属性的方式。
表达式 AllCategories.categories[category]?[subcategory] ?? "❌"
将在您每次使用 属性 时计算。这不是一个太耗时的表达,所以IMO没问题。
在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] ?? "❌"
}()
我也不太喜欢这种方法,我发现它对于我想要做的事情来说过于复杂。这也使得 emoji
a var
而不是 let
而不是,我希望它保持不变。另一方面,我可以继续使用自动生成的初始化程序。
问题:
- 我还有哪些其他可能性?
- 如果有none,2个方法中哪个最好?
这听起来是使用计算属性的好机会:
var emoji: Character {
AllCategories.categories[category]?[subcategory] ?? "❌"
}
虽然它被声明为 var
,但您实际上无法设置它。这就是必须声明计算属性的方式。
表达式 AllCategories.categories[category]?[subcategory] ?? "❌"
将在您每次使用 属性 时计算。这不是一个太耗时的表达,所以IMO没问题。