typealias的用法

转载自: 王巍

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

func distanceBetweenPoint(point: CGPoint, toPoint: CGPoint) -> Double {
    let dx = Double(toPoint.x - point.x)
    let dy = Double(toPoint.y - point.y)
    return sqrt(dx * dx + dy * dy)
}

let origin: CGPoint = CGPoint(x: 0, y: 0)
let point: CGPoint = CGPoint(x: 1, y: 1)

let distance: Double = distanceBetweenPoint(origin, toPoint: point)

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

typealias Location = CGPoint
typealias Distance = Double

func distanceBetweenPoint(point: Location, toPoint: Location) -> Distance {
    let dx = Distance(toPoint.x - point.x)
    let dy = Distance(toPoint.y - point.y)
    return sqrt(dx * dx + dy * dy)
}

let origin: Location = Location(x: 0, y: 0)
let point: Location = Location(x: 1, y: 1)

let distance: Distance = distanceBetweenPoint(origin, toPoint: point)
同样的代码,在 typealias 的帮助下,读起来就轻松多了。可能单单这个简单例子不会有特别多的体会,但是当你遇到更复杂的实际问题时,你就可以不再关心并去思考自己代码里那些成堆的 Int 或者 String 之类的基本类型到底代表的是什么东西了,这样你应该能省下不少脑细胞。

你可能感兴趣的:(typealias)