美文网首页
泛型的意思

泛型的意思

作者: 枫叶1234 | 来源:发表于2017-12-25 14:29 被阅读9次

    在上面的泛型函数例子中,占位符T是类型参数的一个例子。类型参数指定并命名一个占位符类型,并用<>包裹,放在函数名后面。一旦一个参数类型确定,就可以指定参数类型,或者返回值的类型,还可以用作函数体的注释类型。在调用的时候会被实际的类型替代,如传递的是Int,就替换为Int,如果传入的是Double类型就替换为Double等等

    5.泛型类型

    除了定义泛型函数,还可以定义泛型类型。如Array,Dictionary的用法

    struct IntStack{

    var items = [Int]()

    //压栈

    mutating func push(item:Int){

    items .append(item)

    }

    //出栈

    mutating func pop()->Int{

    return items.removeLast()

    }

    }

    这个是一个泛型版本的栈

    struct Stack{

    var items = [Element]()

    mutating func push(item:Element){

    items.append(item)

    }

    mutating func pop()->Element{

    return items.removeLast()

    }

    }

    7.类型约束

    在上面的SwapTwoVlues 和 Stack中,可以作用任何类型。但是也可以添加一个约束,比如指定一个类型必须采纳某协议或者是指定类等。在Swift中(Bool,Int,Doube,String默认都是哈希的),Dictionary的键就需要必须是可哈希的,方便字典查找是否已包含某个键的值。

    类型约束语法

    可以在类型参数名后面加一个类型或者协议名,通过冒号隔开,多个类型参数之间用逗号隔开

    func somFuntion(someClass:C,someProtocol:P){

    }

    在定义的这个函数中,有两个类型约束,第一次类型参数C代表是某个类,第二个参数P代表某个协议。

    func findIndex (array:[S],_ valueToFind:S)->Int? {

    for  (index,value) in array.enumerate(){

    if value == valueToFind { //如果没指定S:Equatable 这句话会编译不通过

    return index

    }

    }

    return nil

    }

    在这个泛型例子中,不是所有的类型都可以 用 == 来比较的,所有必须指定泛型类型参数的约束为 Swift提供的 Equatable 协议,这表示S代表的类型必须是支持 Equatable 协议的。所有的Swift标准类型默认都是支持Equatable协议的.

    相关文章

      网友评论

          本文标题:泛型的意思

          本文链接:https://www.haomeiwen.com/subject/cwotgxtx.html