Using Error Handling to make Struct(or class) initializer as throwable initializer:

Example Error Handling enum:

enum ValidationError: Error {
    case invalid
}

You can use Error Handling enum to check the parameter for the Struct(or class) meet expected requirement

struct User {
    let name: String

    init(name: String?) throws {

        guard let name = name else { 
           ValidationError.invalid
        }

        self.name = name
    }
}

Now, you can use throwable initializer by:

do {
   let user = try User(name: "Sample name")
            
   // success
}
catch ValidationError.invalid {
     // handle error
}