泛型

泛型总的来说有两种使用:泛型函数、泛型类型

// 泛型函数
fun  oneBasicGenericityFunction<T>(_ a: inout T, _ b: inout) {
  // do something
}
// 泛型类型
struct  oneBasicGenericityClass<Element> {
  var items = [Element]()
}

在上面的 例子中,占位类型 T ,Element是类型参数的一个例子。类型参数指定并命名一个占位类型,并且紧随在函数名或者类型名后面,使用一对尖括号括起来(例如 <T>,<Element>)。

扩展泛型类型
 extension oneBasicGenericityClass {  
  var topItem: Element? {
        return items.isEmpty ? nil : items[items.count - 1]
    }
  func pirntElements {
      for value in items.enumerated {
          print(value)
      }
  }
}

可以看出当你扩展一个泛型类型的时候,你并不需要在扩展的定义中提供类型参数列表。原始类型定义中声明的类型参数列表在扩展中可以直接使用,并且这些来自原始类型中的参数名称会被用作原始定义中类型参数的引用。

类型约束

上面的oneBasicGenericityFunction(::)泛型函数和oneBasicGenericityClass泛型类型中的T,Element可以是任何类型。不过,有的时候如果能将使用在泛型函数和泛型类型中的类型添加一个特定的类型约束,将会是非常有用的。类型约束可以指定一个类型参数必须继承自指定类,或者符合一个特定的协议或协议组合。类型参数的基本语法如下:

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // 这里是泛型函数的函数体部分
}

在Swift中,class、struct、enums都可以是用参数化类型来表达泛型的,只有在协议中需要使用associatedtype关键字来表达参数化类型。为什么协议不采用这样的语法形式呢? 问题答案传送门

未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本章将会介绍 泛型所解决的问题泛型函数类型参数命名类型参数泛型类型扩展一个泛型类型类型约束关联类型泛型 Where...
    寒桥阅读 703评论 0 2
  • 泛型(Generics) 泛型代码允许你定义适用于任何类型的,符合你设置的要求的,灵活且可重用的 函数和类型。泛型...
    果啤阅读 754评论 0 0
  • 泛型的概念 泛型代码可根据自定义需求,写出适用于任何类型、灵活且可重用的函数和类型,避免重复的代码,用一种清晰和抽...
    伯wen阅读 456评论 0 2
  • object 变量可指向任何类的实例,这让你能够创建可对任何数据类型进程处理的类。然而,这种方法存在几个严重的问题...
    CarlDonitz阅读 1,005评论 0 5
  • 今晚怎么写都写不好,以为是笔的原因,换了一支,依然一样,以为是字的原因,换了个字,也依然一样。心情不美丽。
    清风_bfd7阅读 232评论 0 0

友情链接更多精彩内容