何时使用泛型参数子句

时间:2014-12-20 23:02:40

标签: swift swift-playground generics swift-extensions

我很快就习惯于仿制药,在阅读一些书时,我遇到了一些我不理解的东西。在泛型函数中,何时使用类型参数(函数名后面的右侧)是否合适?什么时候不合适?

这里是一个不使用它的例子(仅限签名;来自标准库):

func sorted(isOrderedBefore: (T, T) -> Bool) -> Array<T>

以下是一个使用它的例子(摘自我正在阅读的书):

func emphasize<T>(inout array:[T], modification:(T) -> T) {
        for i in 0 ..< array.count {
            array[i] = modification(array[i])
        }
}

我阅读了Apple的快速语言参考,部分:通用参数和参数。但我现在还不清楚。提前感谢任何见解。

1 个答案:

答案 0 :(得分:3)

在第一个示例中,泛型参数来自其定义的类型。我相信它已经在Array中声明,它已经具有泛型类型T

在第二个示例中,函数本身声明了泛型参数。如果我没有弄错,这个函数是一个全局函数。它不在定义通用T的范围内。

在一个隐藏或试图替换已在其范围内声明的函数的函数中声明一个新的泛型参数是不合适的。例如,在扩展数组时,这是不合适的:

extension Array {
    func myFunc<T>() {
    }
}

这里我们定义一个新的T,它隐藏了已在Array声明中声明的原始T

在您想要通用类型的所有其他情况下,您应该自己声明它。