Создание ограниченного инициализатора без использования типа в подписи

#swift

#swift

Вопрос:

Это мой код:

 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 , а затем создает a Lizard без передачи экземпляра Person конструктору? Lizard должен быть в состоянии создать Person , если тип Person соответствует SimpleInit .

Ответ №1:

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

 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())
    }
}