您能否解释一下为什么要将初始化程序放在Swift的协议中?我认为协议的责任是定义具体的实现方式,而不必详细说明实现细节。初始化器不是这样吗?
这是一个非常人为的示例:
protocol P {
init(a: Int)
}
class B: P {
let a: Int
required init(a: Int) {
self.a = a
}
}
func factory<T: P>(a: Int) -> T {
return T(a: a)
}
let b: B = factory(a: 1)
通过允许协议(P
)指定所需的初始化程序,我可以编写需要创建新对象的factory
函数。
Init不会说您对传入的Int
做些什么,只是可以从一个Int中使P
具体值。
有时您实际上希望协议明确声明类型支持特定类型的初始化程序。实际上,标准库中有几种,使您自己的某些类型符合它们很有用。例如查看ExpressibleByArrayLiteral。此协议是您可以使用数组文字(例如Set
[1,2,3]
的原因)