这两个函数在功能上有什么实际区别吗?
func testX<T>(value:T) where T:StringProtocol {
// Do something
}
func testY<T:StringProtocol>(value:T){
// Do something
}
它们似乎都可以编译和运行。想知道为什么有两种不同但看似相同的语法。
没有区别。第一种形式
func testX<T>(value: T) where T: StringProtocol
在 SE-0081 中引入了将 where 子句移动到声明的末尾以提高可读性,特别是对于较长的约束列表。理由是将where
子句从通用参数列表中删除,例如
func foo<S: Sequence where S.Element == Int>(seq: S)
成为
func foo<S: Sequence>(seq: S) where S.Element == Int
在斯威夫特 3 中。作为副作用,即使是简单的约束,例如您的T: StringProtocol
可以移动到新引入的 where-子句。