我想知道这两个通用函数之间的区别,以及使用的函数
当我使用两个结果是相同的,所以哪一个使用
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子句中看到这些约束的唯一原因是因为它们是自动生成的。但显然,有些人觉得在某些条件下它们是可以接受的,甚至更可取。