Swift - 关键字(typealias、associatedtype)

Typealias

typealias 是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。使用的语法也很简单,使用typealias 关键字像使用普通的赋值语句一样,可以将某个已经存在的类型赋值为新的名字。比如在计算二维平面上的距离和位置的时候,我们一般使用Double来表示距离,用CGPoint来表示位置:

[javascript] view plain copy

  1. func distance(_ point: CGPoint, _ anotherPoint: CGPoint) -> Double {
  2. let dx = Double(anotherPoint.x - point.x)
  3. let dy = Double(anotherPoint.y - point.y)
  4. return sqrt(dx * dx + dy * dy)
  5. }
  6. let origin = CGPoint(x: 3, y: 0)
  7. let point = CGPoint(x: 4, y: 0)
  8. let d = distance(origin, point)

虽然在数学上和最后的程序运行上都没什么问题,但是阅读和维护的时候总是觉得有哪里不对。 因为我们没有将数学抽象和实际问题结合起来,使得在阅读代码时我们还需要在大脑中进行一次额外的转换:CGPoint代表一个点,而这个点就是我们在定义的坐标系里的位置; Double是一个 数字,它代表两个点之间的距离。

如果我们使用 typealias,就可以将这种转换直接写在代码里,从而减轻阅读和维护的负担:

[javascript] view plain copy

  1. func distance(_ point: CGPoint, _ anotherPoint: CGPoint) -> Double {
  2. let dx = Distance(anotherPoint.x - point.x)
  3. let dy = Distance(anotherPoint.y - point.y)
  4. return sqrt(dx * dx + dy * dy)
  5. }
  6. let origin = Location(x: 3, y: 0)
  7. let point = Location(x: 4, y: 0)
  8. let d = distance(origin, point)

同样的代码,在 typealias 的帮助下,读起来就轻松多了。可能单单这个简单例子不会有特别多的 体会,但是当你遇到更复杂的实际问题时,你就可以不再关心并去思考自己代码里那些成堆的Int或者String之类的基本类型到底代表的是什么东西了,这样你应该能省下不少脑细胞。注意:开发过程中,当使用的比包的使用,会经常使用typealias

[javascript] view plain copy

  1. typealias Success = (_ data: String) -> Void
  2. typealias Failure = (_ error: String) -> Void
  3. func request(_ url: String, success: Success, failure: Failure) {
  4. // do request here ....
  5. }

typealias与泛型

typealias 是单一的,也就是说你必须指定将某个特定的类型通过typealias赋值为新名字,而不能将整个泛型类型进行重命名。下面这样的命名都是无法通过编译的:

[javascript] view plain copy

  1. class Person<T> {}
  2. typealias Woker = Person
  3. typealias Worker = Person<T>

不过如果我们在别名中也引入泛型,是可以进行对应的

[javascript] view plain copy

  1. class Person<T> {}
  2. typealias Woker = Person
  3. typealias Worker<T> = Person<T>

当泛型类型的确定性得到保证后,显然别名也是可以使用的:

[javascript] view plain copy

  1. class Person<T> {}
  2. typealias WorkId = String
  3. typealias Worker = Person<WorkId>

另一个使用场景是某个类型同时实现多个协议的组合时。我们可以使用&符号连接几个协议,然后给它们一个新的更符合上下文的名字,来增强代码可读性:

[javascript] view plain copy

  1. protocol Cat {}
  2. protocol Dog {}
  3. typealias Pat = Cat & Dog

associatedtype关联类型

定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 associatedtype 关键字来指定关联类型。比如使用协议声明更新cell的方法:

[javascript] view plain copy

  1. //模型
  2. struct Model {
  3. let age: Int
  4. }
  5. //协议,使用关联类型
  6. protocol TableViewCell {
  7. associatedtype T
  8. func updateCell(_ data: T)
  9. }
  10. //遵守TableViewCell
  11. class MyTableViewCell: UITableViewCell, TableViewCell {
  12. typealias T = Model
  13. func updateCell(_ data: Model) {
  14. // do something ...
  15. }
  16. }

原文地址:https://www.cnblogs.com/feng9exe/p/9102742.html

时间: 2024-08-03 09:13:16

Swift - 关键字(typealias、associatedtype)的相关文章

iOS开发——Swift篇&amp;Swift关键字详细介绍

Swift关键字详细介绍 每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var.” 用于子句的: “ break, case, continue, default, do, else, fallthrough, if, i

Swift typealias associatedType

使用typealias为常用数据类型起一个别名, 一方面更容易通过别名理解该类型的用途, 另一方面还可以减少日常开发的代码量. typealias使用实例: // 网络请求常用回调闭包 typealias SuccessWithMsg = ((_ msg:String) -> Void) typealias FailWithError = ((Error) -> Void) // 用&连接多个协议 typealias UITableViewCommonProtocol = UITabl

swift protocol(协议) associatedtype关联类型

定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用.关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定.你可以通过 associatedtype 关键字来指定关联类型.比如使用协议声明更新cell的方法: //模型 struct Model { let age: Int } //协议,使用关联类型 protocol TableViewCell { associatedtype T func updateCell(_ da

Swift 关键字汇总

常见的关键字有以下4种 与声明有关的关键字:class.deinit.enum.extension.func.import.init.let.protocol.static.struct.subscript.typealias和var. 与语句有关的关键字:break.case.continue.default.do.else.fallthrough.if.in.for.return.switch.where和while. 表达式和类型关键字:as.dynamicType.is.new.supe

swift 关键字willSet 和 didSet

// 下面是苹果给出的解释,就是在给属性设置新值的时候,可以在设置前和设置后做一些处理,这两个关键字就好像对该属性变化的监控 If you don’t need to compute the property but still need to provide code that is run before and after setting a new value, use willSet and didSet. For example, the class below ensures tha

Swift类型转换 和 类型别名的定义(typealias)

(一)类型转换 类型转化在 Swift 中是比较严格的,不同类型之间可以认为是不能相互转化的,只能重新产生一个对象和值,并拷贝一份. 1.0 整型数值之间的转换. // 不同类型是不能直接相加的,这时我们就需要用到类型转换 let int8 : Int8 = 12 let int16 : Int16 = 14 + Int16(int8) print(int16) //输出 : 26 又上可见,通过转化也可以顺利得到正确的值,但是值得我们注意的是:由短整型向长整型转换是都可以成功的,且不会丢失值:

函数式编程-将Monad(单子)融入Swift

前言 近期又开始折腾起Haskell,掉进这个深坑恐怕很难再爬上来了.在不断深入了解Haskell的各种概念以及使用它们去解决实际问题的时候,我会试想着将这些概念移植到Swift中.函数式编程范式的很多概念在Swift等主打面向对象范式的语言中就像各种设计模式一样,优雅地帮助我们构建好整个项目,促使我们的代码更加的美观优雅.安全可靠. 本篇文章为"函数式编程"系列中的第二篇,我主要说下Monad的一些小概念,以及试图将Monad融入Swift中来让其为我们的实际工程项目作出贡献. 关于

3.Swift基础知识

Swift是用来开发iOS和OS X应用的新语言,但是许多地方用起来跟C或者OC是差不多的. Swift提供了C语言和OC的基本数据类型,比如整型用Int,浮点型用Double或者Float,布尔型用Bool,字符串文本用String,Swift还提供了两种集合类型,Array和Dictionary,后面会介绍. Swift也跟C一样用唯一的变量名来存储与使用数据,还能使用一些值不会变的变量,应该说是常量,比C里面的常量要强大.在涉及到一些值不会发生变化的数据时使用常量类型能让代码更安全整洁.

Swift基础学习(一)基本语法

Swift 简介(赞美一番,收集了多篇 关于Swift 学习教程的语言简介一直以为英语和汉语混写的时候只是英语字母结尾的地方打空格,原来是英语字母的开头和结尾都要加一个空格,英语字母后面是标点符号的时候不加空格): Swift 是一种新的编程语言,用于编写 iOS,macOS,watchOS 和 tvOS 的应用程序.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣.Swif