泛型while子句和符合协议的参数之间的区别



我想知道这两个通用函数之间的区别,以及使用的函数

当我使用两个结果是相同的,所以哪一个使用

func setObject<T: Codable>(object: T, forkey: String){

}
func setObject1<T>(object: T, forkey: String) where T : Codable{

}

第一个例子是"糖";对于第二个例子。它们的意思是一样的,并且编译为相同的输出"糖";只是让普通的东西更容易写,比如T?而不是Optional<T>。(这里的历史有点倒退,因为第二个是原始语法,但今天把它看作糖仍然很好。(

对于简单的签名,第一个要短一点。第二种更灵活,并且可以更好地扩展长签名,特别是当存在多个类型参数和更复杂的需求时。

举个例子,我认为很多(可能大多数(人都会使用第一个,因为它很短,但如果有任何超出这一范围的复杂性,不要害怕移动到第二个。

有关推理和意图的更多信息,请参阅添加where条款的SE SE-0081。有关这方面的讨论,请参阅链接的螺距螺纹。SE本身仅指where子句的位置。

通过stdlib,我看到了这两种方法,甚至对于简单的需求(f<T: P>(...)f<T>(...) where T:P(也是如此。

但文档通常是f<T>(...) where T:P:

init<S>(_ elements: S) where S : Sequence, Element == S.Element

即使实现使用另一个:

public init<S: Sequence>(_ s: S) where S.Element == Element {

(我在全新的并发代码中看到了与非常旧的Array代码相同的差异,所以我不认为这只是代码的年龄问题。(

它们的意思完全相同。第二个更丑。


编辑:我不同意Rob的观点——我认为当你可以将相同的信息放入原始约束中时,你永远不应该使用where子句,所以我投票结束这个问题,因为我刚刚了解到"使用哪一个";这是一个意见问题。

我一直认为,在where子句中看到这些约束的唯一原因是因为它们是自动生成的。但显然,有些人觉得在某些条件下它们是可以接受的,甚至更可取。

最新更新