Swift(4) - 泛型函数可以专门用于init()生成"空"对象?

时间:2017-08-08 15:19:19

标签: swift generics

是否可以将泛型函数仅限制为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 - 例如,RangeReplaceableCollectionSetAlgebra都有产生空集合的内容。但似乎并不是一个包含&#34概念的协议; no-arg构造函数创建了一个集合的空实例&#34;适用于所有收藏类型。

1 个答案:

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