Создать ограниченный инициализатор без использования типа в подписи - PullRequest
0 голосов
/ 18 апреля 2019

Это мой код:

protocol SimpleInit {
    init()
}

class Person {}

class Lizard<T: Person> {
    let person: T

    init(person: T) {
        self.person = person
    }

    // error: 'where' clause cannot be attached to a non-generic declaration
    init() where T: SimpleInit { 
        self.person = T.init()
    }
}

Возможно ли, что у меня есть подкласс Person, который соответствует SimpleInit, и позже создаст Lizard, не передавая экземпляр Person конструктору?Lizard должен иметь возможность создать Person, если тип Person соответствует SimpleInit.

1 Ответ

2 голосов
/ 18 апреля 2019

Вам просто нужно переместить инициализатор в условное расширение:

protocol SimpleInit {
    init()
}

class Person {
    required init() {}
}

class Lizard<T: Person> {
    let person: T

    required init(person: T) {
        self.person = person
    }

}

extension Lizard where T: SimpleInit {
    convenience init()  { 
        self.init(person: T.init())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...