Joker
Joker

Reputation: 167

init new class instance with args object parameter which conforms to a protocol

I've a class and a protocol into myModel.swift

public protocol IModelArgs{
    var name: String { get set};
    var surname: String { get set};
}

public class Model {
    var name: String;
    var surname: String;
    init(args: IModelArgs) {
        self.name = args.name;
        self.surname = args.surname;
    }
}

IModelArgs is the protocol of arguments object passed to Model constructor. Into another file I need to create the instance of Model class, but I'm not able to pass args object to constructor: What I'm wrong?

let myM = Model(args: ("T1","T2"));

Upvotes: 1

Views: 739

Answers (1)

Alexey Pichukov
Alexey Pichukov

Reputation: 3405

The main problem in your case that ("T1","T2") is a tuple and not the object that conform your protocol. In your case it should look like this:

struct ArgsObject: IModelArgs {
    var name: String
    var surname: String
}

let myM = Model(args: ArgsObject(name: "someName", surname: "someSurname"))

But if you want to use the protocol only to pass an object to the constructor, you do not need to do this. Create struct for it like this:

struct ArgsObject {
    let name: String
    let surname: String
}

class Model {
    var name: String
    var surname: String

    init(args: ArgsObject) {
        self.name = args.name
        self.surname = args.surname
    }
}

let myM = Model(args: ArgsObject(name: "someName", surname: "someSurname"))

Few optional comments

Don't use ; and protocol names like ISomething, it's not the Java

Upvotes: 4

Related Questions