Home > Software engineering >  Is it possible to have default member initialization with a class in Swift (like with a struct)
Is it possible to have default member initialization with a class in Swift (like with a struct)

Time:06-25

In the following example code, I create a struct and a class with similar members. With the struct I can initialize an instance by any number of the members into its constructor, and the rest will default. With a class, I have to specify every version of init I want to use. Seems like I must be missing some way to do it with a class though -- is there any way to do this? It looks like in 2016 there was not, but I know Swift has changed a ton since then. I'm hoping there is a way now.

import Foundation

struct FooStruct {
    var id: UUID = UUID()
    var title = ""
}

// these statements both work fine
let a = FooStruct(id: UUID())
let a2 = FooStruct(title: "bar")

class FooClass {
    var id: UUID = UUID()
    var title = ""
}

// these statements both give the same error:
// Argument passed to call that takes no arguments
let b = FooClass(id: UUID())
let b2 = FooClass(title: "bar")

CodePudding user response:

What you are seeing with Structure types is what is called a memberwise initializer. Swift does not provide one of these to Class types because of the more complex way Classes are initialized, due to their inheritance model.

Swift provides a default initializer—different than a memberwise initializer—for any structure or class that provides default values for all of its properties and doesn’t provide at least one initializer itself. The default initializer simply creates a new instance with all of its properties set to their default values.

CodePudding user response:

you could just use this:

class FooClass {
    var id: UUID = UUID()
    var title = ""
    
    init(id: UUID = UUID(), title: String = ""){
        self.id = id
        self.title = title
    }
}

and this will work:

    let b = FooClass(id: UUID())
    let b2 = FooClass(title: "bar")
  • Related