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 中。