"init" 在 Swift 的协议中 - 有什么用?
"init" in Swift's protocols - what for?
您能否解释一下为什么要将初始值设定项放入 Swift 的协议中?
我认为协议的职责是定义具体实现可以做什么,而不需要指定实现细节。 initializer不就是这么回事吗?
这是一个非常人为的例子:
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。这个协议是你可以用像 [1,2,3]
这样的数组文字初始化 Set
的原因
您能否解释一下为什么要将初始值设定项放入 Swift 的协议中? 我认为协议的职责是定义具体实现可以做什么,而不需要指定实现细节。 initializer不就是这么回事吗?
这是一个非常人为的例子:
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。这个协议是你可以用像 [1,2,3]
Set
的原因