美文网首页Swift
22.Swift学习之泛型

22.Swift学习之泛型

作者: YungFan | 来源:发表于2018-11-20 09:08 被阅读92次

泛型

  • 一个案例引发的思考
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}


var oneInt = 3
var twoInt = 4
swapTwoInts(&oneInt, &twoInt)
print(oneInt,twoInt)

如果此时我们想交换两个Double类型、或者是其他类型的值,就需要针对不同的类型写类似的方法,但是这些方法仅仅只是参数类型不同。如何解决?—— 泛型

//泛型函数
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}


var oneInt = 3
var twoInt = 4
swapTwoValues(&oneInt, &twoInt)
print(oneInt,twoInt)

var oneStr = "hello"
var twoStr = "world"
swapTwoValues(&oneStr, &twoStr)
print("oneStr:\(oneStr),twoStr:\(twoStr)")

var oneDouble = 10.01
var twoDouble = 20.02
swapTwoValues(&oneDouble, &twoDouble)
print("oneDouble:\(oneDouble),twoDouble:\(twoDouble)")

类型参数

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

类型约束

  • 上面的swapTwoValues(_:_:)函数可以用于任意类型。但是,有时在用于泛型函数需要遵循特定的类型。
  • 类型约束指出一个类型形式参数必须继承自特定类,或者遵循一个特定的协议、组合协议。
  • 语法
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
}

关联类型

  • 关联类型通过 associatedtype 关键字指定
  • Element 起到了占位符的作用,指示了某种类型
  • 在实现的时候不能直接用 Element
  • Element 在遵守协议中协议方法中明确泛型的类型
protocol SomeProtocol {

    associatedtype Element
    
    func method1(element: Element)
    func method2(element: Element)
}



struct TestStruct: SomeProtocol {
    
    func method1(element: String) {
        print("method1: \(element)")
    }
    
    func method2(element: String) {
        print("method2: \(element)")
    }
}
TestStruct().method1(element: "Hello")  
TestStruct().method2(element: "World")

给关联类型添加约束

//要遵循这个版本的 Container ,容器的 Item 必须遵循 Equatable 协议
protocol SomeProtocol {

    associatedtype Element: Equatable
    
    func method1(element: Element)
    func method2(element: Element)
}

相关文章

  • 22.Swift学习之泛型

    泛型 一个案例引发的思考 如果此时我们想交换两个Double类型、或者是其他类型的值,就需要针对不同的类型写类似的...

  • Geekband-third week of part3

    1.泛型算法之变易算法 2.泛型算法之排序 3.泛型算法之泛型数值算法 4.内存分配器

  • Android 学习(一):Java 泛型

    Java泛型学习 1.0 泛型常用案例 2.0 泛型方法 3.0 泛型类 4.0 通配符 ? 通配符,占位符,标识...

  • Java学习之泛型

    一、泛型概述 --->JDK1.5新特性 1、泛型的出现: 1、泛型是在JDK1.5以后出现的新特性。泛型是用于解...

  • Kotlin学习之泛型

    Kotlin学习之泛型 Kotlin的泛型与Java一样,都是一种语法糖,只在源代码里出现,编译时会进行简单的字符...

  • Swift学习之泛型

    泛型能够让开发者编写自定义需求已经任意类型的灵活可用的的函数和类型。能够让我们避免重复的代码。用一种清晰和抽象的方...

  • Swift学习之泛型

    swapTwoInts(::) 函数很实用,但是它只能用于 Int 值。如果你想交换两个 String 值,或者两...

  • Java泛型与Kotlin泛型

    Java泛型 学习并掌握泛型类和泛型接口定义和使用 学习并掌握泛型函数的定义和使用 很清晰明了的使用教程 Kotl...

  • 详解Java泛型之4——一个例子理解泛型带来的好处

    前面我介绍了关于泛型、通配符以及泛型擦除的相关知识点,大家可以参考以下文章: 详解Java泛型之1——入门泛型必懂...

  • Java泛型

    一、学习目标 1.泛型的作用和定义 2.泛型的基本使用 3.泛型中的通配符 4.泛型擦除 5.泛型中的约束和局限 ...

网友评论

    本文标题:22.Swift学习之泛型

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