инициализировать новый экземпляр класса с параметром объекта args, который соответствует протоколу

У меня есть класс и протокол в 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 — это протокол объекта аргументов, передаваемого конструктору модели. В другом файле мне нужно создать экземпляр класса Model, но я не могу передать объект args конструктору: что я не так?

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

person Joker    schedule 20.05.2017    source источник
comment
Почему именно вы используете протокол здесь? Почему бы просто не использовать инициализатор, который принимает параметры name: и surname:?   -  person Hamish    schedule 20.05.2017
comment
Не связано, но обратите внимание, что вам не нужно заканчивать операторы точкой с запятой (если только вы не разделяете несколько операторов в одной строке).   -  person Hamish    schedule 20.05.2017
comment
Ваш объект аргумента не соответствует протоколу. Я бы посоветовал вам использовать структуру, соответствующую вашему протоколу. А также я думаю, что вы не хотите, чтобы аргумент был установлен, а был получен только потому, что вы не измените его после инициализации.   -  person Luzo    schedule 20.05.2017
comment
@Hamish, потому что теперь объект args имеет только имя и фамилию, но следующий станет более сложным объектом, который я буду повторно использовать в других контекстах.   -  person Joker    schedule 20.05.2017


Ответы (1)


Основная проблема в вашем случае в том, что ("T1","T2") - это кортеж, а не объект, соответствующий вашему протоколу. В вашем случае это должно выглядеть так:

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

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

Но если вы хотите использовать протокол только для передачи объекта в конструктор, этого делать не нужно. Создайте для него struct вот так:

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"))

Несколько необязательных комментариев

Не используйте ; и имена протоколов, такие как ISomething, это не Java.

person Alexey Pichukov    schedule 20.05.2017