直接对泛型类型进行类型约束与直接使用'where'子句之间是否存在实际区别?



这两个函数在功能上有什么实际区别吗?

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-子句。

最新更新