是否可以将泛型函数仅限制为init()生成空对象的类型?例如:
public func constructDefaultObject<C>() -> C where C: SomeProtocol {
return C()
}
没有where
子句,会产生错误:
error: numbers.playground:3:12: error: non-nominal type 'C' does not support explicit initialization
return C()
^~~
如果我使用C.init()
代替,则会出现类似的错误:
error: numbers.playground:3:12: error: type 'C' has no member 'init'
return C.init()
^ ~~~~
似乎有一些协议提供了无参数init
- 例如,RangeReplaceableCollection
和SetAlgebra
都有产生空集合的内容。但似乎并不是一个包含&#34概念的协议; no-arg构造函数创建了一个集合的空实例&#34;适用于所有收藏类型。
答案 0 :(得分:1)
是的,这是可能的,但它并没有多大用处:
// This is a shitty protocol that doesn't do much. Don't use it.
public protocol DefaultConstructible {
init()
}
public func constructDefaultObject<C>() -> C where C: DefaultConstructible {
return C()
}