美文网首页
泛型(三)

泛型(三)

作者: 小橘子成长记 | 来源:发表于2018-07-10 13:08 被阅读5次

Arrays

虽然原来的Keeper类型说明了泛型类型不需要存储任何内容或使用它的类型参数,但泛型类型的最常见就是同时具有这两种功能。这就是Array类型。

使用泛型数组是发明泛型类型的原始动机的一部分。由于许多程序需要相同类型的数组,所以泛型数组使代码更安全。

你一直在使用数组,但是只有[Element]的预防,而不是Array<Element>. 思考一个这样的数组:

let animalAges: [Int] = [2,5,7,9]

这相当于下面这个数组:

let animalAges: Array<Int> = [2,5,7,9]

Array<Int>和[Int]是完全可互换的。你甚至可以通过[Int]()而不是Array <Int>()来调用数组的默认初始化方法。

由于Swift数组只允许对元素序列进行索引访问,所以它们对元素类型没有要求。但情况并非总是如此。

Dictionaries

Swift泛型允许多个类型参数和对它们的一系列复杂的限制。它们允许你使用具有关联类型的泛型类型和协议来建立复杂的算法和数据结构。字典就是一个简单的例子。

Dictionary在逗号分隔的泛型参数列表中有两个类型参数,它们位于尖括号之间,您可以在它的声明中看到:

struct Dictionary<Key: Hashable, Value> // etc..

Key和Value表示字典的键和值的类型。但是Key上的注释,Key: Hashable表示的意义很多。冒号之后的所有内容都是类型约束。类型约束指明了该类型参数父类型,以及所需的协议或协议列表。

例如,Dictionary的类型约束要求作为Dictionary键的任何类型都是hashable,因为Dictionary是一个散列映射,必须对其键进行散列,以启用快速查找。

要实例化具有多个类型参数的类型(如Dictionary),只需提供一个逗号分隔的类型参数列表:

let intNames: Dictionary<Int, String> = [42: "forty-two"]

与数组一样,字典在Swift中也有一些特殊的处理,因为它们是内置的,而且非常常见。你已经见过速记表示法[Key: Value],还可以使用类型推断:

let intNames2: [Int: String] = [42: "forty-two", 7: "seven"]
let intNames3 = [42: "forty-two", 7: "seven"]

Optionals

最后,对泛型的讨论如果不提及Optionals,就不完整。Optionals通过枚举实现,但它们也是另一种泛型类型,你可以自己定义它。

假设你正在编写一个应用程序,该应用程序允许用户以表单的形式输入她的生日,但不是必须的。你可能会发现定义enum类型很方便,如下所示:

enum OptionalDate {
  case none
  case some(Date)
}

类似地,如果另一个表单不要求用户输入她的姓,你可以定义以下类型:

enum OptionalString {
  case none
  case some(String)
}

然后,你可以捕获用户所输入或未输入的所有信息:

struct FormResults {
  // other properties here
  var birthday: OptionalDate
  var lastName: OptionalString
}

如果你发现新类型在重复做这些,那么你会想把它归纳成一个泛型类型来表示“可能存在的特定类型的值”的概念。因此,你可以这样写:

enum Optional<Wrapped> {
  case none
  case some(Wrapped)
}

此时,你将复制Swift自己的Optional < Wrapped >类型,因为这与Swift标准库中的定义非常接近!事实证明,Optional < Wrapped >接近于一个普通的旧泛型类型,就像你自己编写的类型一样。

只有当你与Optional进行交互时,它才会是一个泛型类型,比如:

var birthdate: Optional<Date> = .none
if birthdate == .none {
  // no birthdate
}

但是,当然,下面这样的更常见也更传统:

var birthdate: Date? = nil
if birthdate == nil {
  // no birthdate
}

实际上,这两个代码块的含义完全相同。

与数组和字典一样,optionals在语言中具有这种语法的特权地位,使使用它们更简洁。但是所有这些特性都提供了访问底层类型的更方便的方法,这只是一个普通的枚举类型。

泛型函数参数

到目前为止,你已经了解了泛型类型在函数、类、结构和枚举中的定义。除了Dictionary之外,所有这些都有一个通用参数。

泛型类型参数列表位于类型名或函数名之后。然后可以在定义的其余部分中使用泛型参数。

这个函数接受两个参数并交换它们的顺序:

func swapped<T, U>(_ x: T, _ y: U) -> (U, T) {
  return (y, x)
}
swapped(33, "Jay")  // returns ("Jay", 33)

泛型函数定义展示了语法的一个令人困惑的方面:它同时具有类型参数和函数参数。您拥有类型参数<T、U>的通用参数列表和函数参数列表(_ x: T、_ y: U)。

相关文章

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • JAVA范型<? extends __> <

    目录 一. 泛型概念的提出(为什么需要泛型)? 二.什么是泛型? 三.自定义泛型接口、泛型类和泛型方法 四.类型通...

  • Java泛型

    泛型有三种实现方式,分别是泛型接口、泛型类、泛型方法。下面通过泛型方法来介绍什么是类型参数。 泛型方法声明方式:访...

  • 想理解泛型吗?看这一篇就够了!

    一、前言二、泛型类2.1 概述Java中泛型使用情况大致包括三种:泛型类、泛型接口、泛型方法 本节演示泛型类。 2...

  • V语言学习笔记-14泛型

    目前的泛型主要有这三种:泛型结构体,泛型函数,泛型方法 泛型结构体 泛型函数 判断2个数组是否相等的泛型函数 泛型方法

  • Kotlin 基础:泛型

    一、为什么要有泛型 效率、成本 减少样板代码的编写 二、泛型的分类 泛型类 泛型方法 三、泛型的关键字 3.1 T...

  • 泛型简单的应用总结:

    泛型可以应用在类,方法,接口中,可以定义泛型类,泛型方法,泛型接口三种 利用泛型的好处: 可以有效的减少代...

  • Java一泛型

    目录 一、设计背景 二、什么是泛型?泛型的作用? 三、泛型的原理 四、使用泛型 一、设计背景 Java集合(Col...

  • Java泛型,你都了解了吗?

    大纲一、为什么需要泛型?泛型的优点二、泛型定义三、限定"类型变量"四、泛型中的约束和局限性五、泛型类型的继承规则和...

  • 泛型

    一.泛型的概念 二.支持泛型的类 不支持泛型的类 支持泛型的类 三.通配符 1.? extends 2.? sup...

网友评论

      本文标题:泛型(三)

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