SwiftUI:为什么将扩展用于自定义结构(Apple iOS App Dev 教程)
SwiftUI: Why Is an Extension Used for a Custom Struct (Apple iOS App Dev Tutorial)
在 Apple [iOS App Dev Tutorial](截至 1 月 22 日)(https://developer.apple.com/tutorials/app-dev-training), under the Creating a Navigation Hierarchy 部分,我们扩展了一个已定义的结构。
我已经尝试阅读 Swift documentation 关于扩展的内容,但不太明白为什么要在这里这样做。该文档讨论了扩展系统类型,例如向系统类型添加额外的属性 Double
,但没有向我们完全控制的事物添加额外的属性,例如我们自己的结构。
我确信这是最佳做法,因为这是一个 Apple 教程,但他们并没有很好地解释它。
这是他们希望您编写的代码示例:
import SwiftUI
struct DailyScrum: Identifiable {
let id: UUID
var title: String
var attendees: [Attendee]
var lengthInMinutes: Int
var theme: Theme
init(id: UUID = UUID(), title: String, attendees: [String], lengthInMinutes: Int, theme: Theme) {
self.id = id
self.title = title
self.attendees = attendees.map { Attendee(name: [=11=]) }
self.lengthInMinutes = lengthInMinutes
self.theme = theme
}
}
extension DailyScrum {
struct Attendee: Identifiable {
let id: UUID
var name: String
init(id: UUID = UUID(), name: String) {
self.id = id
self.name = name
}
}
}
我不确定为什么 Attendee
结构必须在扩展中定义。例如,这也适用:
import SwiftUI
struct Attendee: Identifiable {
let id: UUID
var name: String
init(id: UUID = UUID(), name: String) {
self.id = id
self.name = name
}
}
struct DailyScrum: Identifiable {
let id: UUID
var title: String
var attendees: [Attendee]
var lengthInMinutes: Int
var theme: Theme
init(id: UUID = UUID(), title: String, attendees: [String], lengthInMinutes: Int, theme: Theme) {
self.id = id
self.title = title
self.attendees = attendees.map { Attendee(name: [=12=]) }
self.lengthInMinutes = lengthInMinutes
self.theme = theme
}
}
我只是不确定你为什么要先做一个再做另一个。
在这种情况下它是样式,也关注代码
你原来写的类型是
DailyScrum.Attendee
如果将其更改为第二个版本,您将拥有 2 个独立的类型。
Attendee
和
DailyScrum
如果不看教程,我会假设还有另一种类型的 Attendee
。比如..
Conference.Attendee
或
WeeklyScrum.Attendee
但是正如您所指出的,只有当它们像同音异义词一样不同时,这才有意义。一些样本是...
Bird.Crane
Construction.Crane
或
Dog.Bark
Tree.Bark
如果您只使用一个 id
和一个 name
,则没有必要使用单独的数据结构。
在教程中,我认为这是一种模式选择,使数据模型更接近于 SwiftUI 布局,以便于理解。
与会者仅显示为使用 ForEach(...) 生成 VStack 的 detailView 的子视图。因此,在没有使用 MVVM 的情况下,明确地将数据模型映射到视图并在代码模式中明确表示 Attendee 类型仅出现在 DailyScrum 的实例中是有意义的,就像与会者详细信息仅显示在 detailView 中。
在 Apple [iOS App Dev Tutorial](截至 1 月 22 日)(https://developer.apple.com/tutorials/app-dev-training), under the Creating a Navigation Hierarchy 部分,我们扩展了一个已定义的结构。
我已经尝试阅读 Swift documentation 关于扩展的内容,但不太明白为什么要在这里这样做。该文档讨论了扩展系统类型,例如向系统类型添加额外的属性 Double
,但没有向我们完全控制的事物添加额外的属性,例如我们自己的结构。
我确信这是最佳做法,因为这是一个 Apple 教程,但他们并没有很好地解释它。
这是他们希望您编写的代码示例:
import SwiftUI
struct DailyScrum: Identifiable {
let id: UUID
var title: String
var attendees: [Attendee]
var lengthInMinutes: Int
var theme: Theme
init(id: UUID = UUID(), title: String, attendees: [String], lengthInMinutes: Int, theme: Theme) {
self.id = id
self.title = title
self.attendees = attendees.map { Attendee(name: [=11=]) }
self.lengthInMinutes = lengthInMinutes
self.theme = theme
}
}
extension DailyScrum {
struct Attendee: Identifiable {
let id: UUID
var name: String
init(id: UUID = UUID(), name: String) {
self.id = id
self.name = name
}
}
}
我不确定为什么 Attendee
结构必须在扩展中定义。例如,这也适用:
import SwiftUI
struct Attendee: Identifiable {
let id: UUID
var name: String
init(id: UUID = UUID(), name: String) {
self.id = id
self.name = name
}
}
struct DailyScrum: Identifiable {
let id: UUID
var title: String
var attendees: [Attendee]
var lengthInMinutes: Int
var theme: Theme
init(id: UUID = UUID(), title: String, attendees: [String], lengthInMinutes: Int, theme: Theme) {
self.id = id
self.title = title
self.attendees = attendees.map { Attendee(name: [=12=]) }
self.lengthInMinutes = lengthInMinutes
self.theme = theme
}
}
我只是不确定你为什么要先做一个再做另一个。
在这种情况下它是样式,也关注代码
你原来写的类型是
DailyScrum.Attendee
如果将其更改为第二个版本,您将拥有 2 个独立的类型。
Attendee
和
DailyScrum
如果不看教程,我会假设还有另一种类型的 Attendee
。比如..
Conference.Attendee
或
WeeklyScrum.Attendee
但是正如您所指出的,只有当它们像同音异义词一样不同时,这才有意义。一些样本是...
Bird.Crane
Construction.Crane
或
Dog.Bark
Tree.Bark
如果您只使用一个 id
和一个 name
,则没有必要使用单独的数据结构。
在教程中,我认为这是一种模式选择,使数据模型更接近于 SwiftUI 布局,以便于理解。
与会者仅显示为使用 ForEach(...) 生成 VStack 的 detailView 的子视图。因此,在没有使用 MVVM 的情况下,明确地将数据模型映射到视图并在代码模式中明确表示 Attendee 类型仅出现在 DailyScrum 的实例中是有意义的,就像与会者详细信息仅显示在 detailView 中。