在不使用签名中的类型的情况下创建约束初始化器

时间:2019-04-18 18:03:59

标签: 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的{​​{1}}子类,并且后来构造了一个SimpleInit而没有将Lizard的实例传递给构造函数?如果Person的类型符合Lizard,则Person应该能够创建Person

1 个答案:

答案 0 :(得分:2)

您只需要将初始化程序移至条件扩展名即可:

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