将协议限制为类时,为什么不能使用协议必需的初始化程序?

时间:2019-04-23 17:46:35

标签: swift

Swift不会让我编译以下带有错误消息的代码

  

使用元类型值构造类类型为“ T”的对象时,必须使用“必需”初始化程序

在指示的行上。协议明确要求使用的初始化程序。将构造移入初始化程序会导致相同的问题。如果删除where Self: ChannelUser(以及使用其方法的代码),则所有内容都会编译。也可以通过在ChannelUser中要求使用初始化程序来解决此问题,但这显然不切实际。

为什么会这样?我是在做错什么还是这是一个错误?

class ChannelUser {
    func ready() {
        print("ready")
    }
}

class A: ChannelUser {  // Cannot be used with MockChannelUser because the initializer takes an Int
    init(a: Int) {
        // do something clever with a
    }
}

class B: ChannelUser, MockableChannelUser {  // Can be used with MockChannelUser
    override required init() {}
}

protocol MockableChannelUser where Self: ChannelUser {
    init()
}

struct MockChannelUser<T: MockableChannelUser> {
    let user = T()  // Error: Constructing an object of class type 'T' with a metatype value must use a 'required' initializer

    init() {
        user.ready()
    }
}

0 个答案:

没有答案