在没有初始化的情况下进行结构初始化时的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] ?? "❌"
}

我不喜欢这种方法,因为它添加了很多不必要的代码,这些代码只有在我添加更多属性后才会增长……我想使用生成的结构初始化程序。另一方面,代码仍然非常简单。

方法二:

使用lazy var仅在调用时计算的。

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

我也不太喜欢这种方法,因为我尝试做的事情太复杂了。这也使得emoji一个var,而不是let它是不是,我希望它仍然是一个常数。另一方面,我可以继续使用自动生成的初始化程序。

问题:

  1. 我还有什么其他可能性?
  2. 如果不存在,则这两个方法中哪一个最好?
清扫器

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift用参数初始化类然后在没有参数的情况下初始化它

任何情况下的默认结构初始化?

默认情况下是否初始化结构变量?

C ++类:在没有构造函数重载的情况下初始化属性

在初始化时从单个属性初始化多个属性

初始化结构

在没有xib文件的情况下初始化NSViewController的子类

Maps Android API 在没有在线初始化的情况下无法离线工作

'GADInvalidInitializationException',原因:'Google 移动广告 SDK 在没有 AppMeasurement 的情况下初始化

如何在没有初始化的情况下声明变量

如何在没有时间的情况下初始化随机

如何确保在没有构造函数的情况下正确初始化对象?

在没有构造函数的情况下初始化const c ++类

如何在没有登录按钮的情况下初始化Google登录?

在没有人工交互的情况下初始化 Python Poetry 项目

如何在没有初始化程序的情况下使用 TopLevel 对象?

如何在没有代码重复的情况下初始化映射?

UCanAccess初始化程序错误(在没有IDE的情况下编译/运行)

如何在没有用户交互的情况下初始化全屏

在没有MAX_ELEMENTS的情况下初始化数组是否更好?

如何在Laravel上没有get()的情况下初始化模型

C ++的类变量可以在没有Java构造函数的情况下初始化吗?

在没有Google服务插件的情况下初始化Firebase云消息传递

如何在没有 IV(初始化向量)的情况下使用 Cipher

在没有类型的情况下初始化对象时,它会调用什么?

没有构造函数的情况下,对象初始化如何发生?

默认变量的值与默认情况下的初始化

没有指定初始化程序的静态结构初始化?

Swift结构扩展添加初始化