Failable Initializer

Hello. Is this the correct way to write a failable initializer with two parameters?:

struct User {
    var name: String
    var stepsToday: Int
    
    init(name: String, stepsToday: Int) {
        self.name = name
        self.stepsToday = stepsToday
    }
    
    init?(name: String?, stepsToday: Int?){
        if let name = name {
            self.name = name
        } else {
            return nil
        }
        
        if let stepsToday = stepsToday {
            self.stepsToday = stepsToday
        } else {
            return nil
        }
    }
}
Answered by Sanesh in 759141022

Understood. Thank you

That compiles, but you will have problems, as you don't know which initializer is called

Consider this simple test:

1. var steps: Int? = 10
2. let us1 = User(name: "hello", stepsToday: 10)
3. if let us1 {
4.     print(us1)
5. }
6. let us2 = User(name: nil, stepsToday: nil)
7. if let us2 {
8.     print(us2)
9. }
10. let us3 = User(name: "hello3", stepsToday: steps)
11. if let us3 {
12.     print(us3)
13. }

You get error on line 3: Initializer for conditional binding must have Optional type, not 'User'

So, you'd better have only a failable initializre and test parameters altogether:

struct User {
    var name: String
    var stepsToday: Int
    
    init?(name: String?, stepsToday: Int?){
        if let name, let stepsToday {
            self.name = name
            self.stepsToday = stepsToday
        } else {
            return nil
        }
        
    }
}

Then, the use is the same, whatever parameters you have.

Accepted Answer

Understood. Thank you

Failable Initializer
 
 
Q