swift中函数与泛函的区别

时间:2014-06-24 04:40:38

标签: swift ios8 xcode6

我想知道swift中Function和Generic函数之间的区别。以下 功能和通用功能是一样的。谁能告诉我通用功能的确切用法?

func simpleMin<T: Comparable>(x: T, y: T) -> T {  //Generic functions
    if x < y {
        return y
    }
    return x
}


func sampleMin(x:AnyObject,y:AnyObject)->AnyObject{  //Function
    if x.integerValue < y.integerValue {
        return y
    }
    return x
}

2 个答案:

答案 0 :(得分:3)

  1. 通用功能更具描述性且类型安全: 示例:如果是通用函数,则调用具有错误类型的函数会导致编译时错误 即

    simpleMin(100,y:200) //有效类型与T
    相同 simpleMin(someOtherTypedObject,y:100.0) //由于类型不匹配而编译时间错误

  2. 泛型类型可以具有类型约束,该约束指定类型参数必须从特定类继承,或者符合特定协议或协议组合。但是无法为 AnyObjectType

  3. 指定类型约束

    ,即波纹管声明给出编译时错误

    func sampleMin(x:AnyObject<Comparable>,y:AnyObject<Comparable>)->AnyObject{  //Error: Cann't specialize the nonGeneric type **AnyObject**
        if x.integerValue < y.integerValue {
            return y
        }
        return x
    }
    

    在第二个函数定义中,您无法确保传递的变量具有可比性。

答案 1 :(得分:3)

通用函数允许您在函数的参数和结果上使用Swift的类型安全性来编写更安全,更清晰的代码。例如,您的第一个函数要求传入的两个参数具有相同的类型,并保证相同类型的返回值:

let minInt: Int = simpleMin(5, 12)
let minDouble: Double = simpleMin(5.0, 12.0)

而你的第二个功能没有提出这样的要求,也没有这样的保证:

let minOne: AnyObject = sampleMin(5, 12.0)     // minOne is an AnyObject holding an Int
let minTwo: AnyObject = sampleMin(5.0, 12)     // minTwo is an AnyObject holding an Double
let minThree: AnyObject = sampleMin("Five", true)   // what is supposed to happen here, exactly?

使用这些AnyObject结果,我需要做额外的检查,以确保我理解函数返回的内容,因为AnyObject(显然)比我的原始参数更不具体。

此外,泛型函数允许您对它们接受的参数设置约束,因此您可以确保仅使用有意义的参数调用该函数。你的第一个函数要求参数符合Comparable协议,这意味着我不能只用两个随机对象来调用它。例如,编译器将让我用两个UIView实例调用你的第二个函数,并且在执行该代码时崩溃之前不会有任何问题。


了解协议是使用泛型的重要部分。协议定义了一些在整个类中有用的特定功能,并将该功能的实现留给了类本身。上面的Comparable协议就是一个例子;这是定义:

protocol Comparable : Equatable {
    func <=(lhs: Self, rhs: Self) -> Bool
    func >=(lhs: Self, rhs: Self) -> Bool
    func >(lhs: Self, rhs: Self) -> Bool
}

这表示任何“符合”Comparable协议的对象都会有使用<=>=>运算符的定义 - 也就是说,您可以为if a > b的任何两个对象编写Comparable


更多阅读:
The Swift Programming Language: Generics
Generic Programming - Wikipedia

泛型一直是C#和Java以及其他语言的一个特性,因此您可以找到更多资源来帮助您了解它们的好处以及如何在文档中使用它们。