【问题标题】:Problems with class initialization类初始化问题
【发布时间】:2020-10-17 04:51:31
【问题描述】:

我认为这是一个简单的问题,但令人头疼。 当实际存在初始化程序时,我收到 ....has no initializers 错误。

这是我的代码:

(编辑:我已经更新了 PatientData 类以包含所有其他变量。我认为它们在解决问题方面没有什么不同,所以为了简洁起见,我将它们排除在外。)

数据结构

class PatientData: Identifiable, ObservableObject
{
    let id = UUID()
    
    @Published var patientName: String = "Name"
    @Published var patientAge: String = "Age"
    @Published var patientDOB: String = "DOB"
    @Published var patientPhone: String = "Phone"
    @Published var patientAddress: PatientAddress

    struct PatientAddress
    {
        var patientStreetAddress: String = "Street"
        var patientCity: String = "City"
        var patientState: String = "State"
        var patientZip: String = "Zip"
        
        init(patientStreetAddress: String, patientCity: String, patientState: String, patientZip: String)
        {
            self.patientStreetAddress = patientStreetAddress
            self.patientCity = patientCity
            self.patientState = patientState
            self.patientZip = patientZip
        }
    }
    
    @Published var facilityName: String = "Facility"
    @Published var facilityRoom: String = "Room Number"
    @Published var facilityFloor: String = "Floor"
    @Published var facilityPhoneNumber: String = "Phone Number"
    
    init(patientName: String, patientAge: String, patientDOB: String, patientPhone: String, patientAddress: PatientAddress, facilityName: String, facilityRoom: String, facilityFloor: String, facilityPhoneNumber: String)
    {
        self.patientName = patientName
        self.patientAge = patientAge
        self.patientDOB = patientDOB
        self.patientPhone = patientPhone
        self.patientAddress = patientAddress
        self.facilityName = facilityName
        self.facilityRoom = facilityRoom
        self.facilityFloor = facilityFloor
        self.facilityPhoneNumber = facilityPhoneNumber
    }
    init() {}
}

内容视图

struct ContentView: View
{
    @ObservedObject var patient = PatientData()
    ...
}

【问题讨论】:

    标签: ios swift swiftui initialization initializer


    【解决方案1】:

    注意:

    PatientData()
    

    相当于:

    PatientData.init()
    

    这意味着如果您想以这种方式创建您的 PatientData:

    @ObservedObject var patient = PatientData()
    

    您需要提供一个匹配的 init 方法(它可以为空,因为您的所有 @Published 属性都已具有默认值):

    init() { }
    

    编辑

    查看您的完整代码,您的某个属性似乎没有初始值:

    @Published var patientAddress: PatientAddress
    

    只有当你的所有属性都已经初始化时,一个空的 init 才会起作用,这意味着你需要为你的 patientAddress 分配一些值:

    @Published var patientAddress = PatientAddress()
    

    但是,要使其正常工作,您还需要在 PatientAddress 中添加一个空的 init:

    struct PatientAddress {
        ...
        init() {}
    }
    

    注意

    如果没有所有这些初始化程序,您的所有代码都可以简单得多。如果您只使用空的 init 方法,则不必声明它们(如果没有其他初始化程序,它们会为结构自动生成):

    class PatientData: Identifiable, ObservableObject {
        let id = UUID()
    
        @Published var patientName: String = "Name"
        @Published var patientAge: String = "Age"
        @Published var patientDOB: String = "DOB"
        @Published var patientPhone: String = "Phone"
        @Published var patientAddress: PatientAddress = PatientAddress()
    
        @Published var facilityName: String = "Facility"
        @Published var facilityRoom: String = "Room Number"
        @Published var facilityFloor: String = "Floor"
        @Published var facilityPhoneNumber: String = "Phone Number"
    }
    
    extension PatientData {
        struct PatientAddress {
            var patientStreetAddress: String = "Street"
            var patientCity: String = "City"
            var patientState: String = "State"
            var patientZip: String = "Zip"
        }
    }
    

    此外,Swift 可以自动推断类型。您通常不必显式声明类型:

    @Published var patientPhone = "Phone"
    @Published var patientAddress = PatientAddress()
    

    【讨论】:

    • 我留下了初始化的主体。请参见上文。
    • @Cubert 不过,如果您将 init() {} 添加到您的课程中,它应该可以工作。但是,根据您收到的错误,您似乎没有向我们展示 whole PatientData 类,并且您遗漏了一些重要的代码。
    • 谢谢!这一切都奏效了。我按照你的建议简化了我的代码。 ?
    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2011-10-29
    相关资源
    最近更新 更多