Swift(4)-泛型函数是否可以在init()生成“;“空的”;对象

Swift(4)-泛型函数是否可以在init()生成“;“空的”;对象,swift,generics,Swift,Generics,是否可以仅将泛型函数约束为其init()生成空对象的类型?例如: public func constructDefaultObject<C>() -> C where C: SomeProtocol { return C() } 如果我使用C.init(),则会出现类似的错误: error: numbers.playground:3:12: error: type 'C' has no member 'init' return C.init()

是否可以仅将泛型函数约束为其init()生成空对象的类型?例如:

public func constructDefaultObject<C>() -> C where C: SomeProtocol {
    return C()
}
如果我使用
C.init()
,则会出现类似的错误:

error: numbers.playground:3:12: error: type 'C' has no member 'init'
    return C.init()
           ^ ~~~~

似乎有一些协议提供了no-arg
init
——例如,
RangeReplaceableCollection
SetAlgenera
都有生成空集合的init。但是似乎没有一个协议包含所有集合类型的“无参数构造函数创建集合的空实例”的概念。

是的,这是可能的,但没有多大用处:

// 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()
}
//这是一个糟糕的协议,没有什么作用。不要用它。
公共协议默认可构造{
init()
}
public func constructDefaultObject()->C其中C:DefaultConstructible{
返回C()
}

@BrainHeim您对
hasdaultconstructor
协议的定义是什么?您想在这里实现什么?标准库中不存在表示“可以用
init()
初始化的任何类型”的协议,这是有充分理由的;它不表达关于所构造实例的任何有意义的语义。我强烈建议大家好好读一读@Alexander,我想我在这里要讲的语义或多或少就是交换幺半群中的单位元。对于将是空集合的集合,对于数字类型,它将是零。这比“DefaultConstructible”更专业,我应该在我的问题中提到这一点。我会更新的。@Hamish-谢谢!那篇文章很有帮助。我来自C++,其中STD::ISHUngaby::Valuy将提供TMP解决方案。当然,模板和协议是不同的。哈米什,我刚刚读完了那篇文章,再次感谢大家的分享。至于我试图实现的目标,我有一个函数,它以一个空的
C
开头,然后将元素添加功能传递给处理程序。这个处理程序在一个内部循环中被多次调用,并且需要自定义,所以我不能只传入一个预构建的集合或几个额外的参数。所以在这种情况下,我真的需要一个协议来表达
emptyconstructable
,而不是别的什么-甚至不是
insert
append
,等等。但这是一种极端的情况,所以如果答案是否定的话,我不介意。我认为这回答了最初的问题,但不是我在评论中修改和讨论过的那个。不过,感谢您的想法,这非常有帮助。:)@BrianHeim在这种情况下,提出一个新问题。像这样移动目标帖子会使评论/答案失去同步和混乱谢谢你的努力@Alexander,你的答案帮助我解决了我的问题。
// 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()
}