IOS_Swift_TYPEALIAS 和泛型接口

来源:互联网 发布:js关闭浏览器右键菜单 编辑:程序博客网 时间:2024/05/20 17:39

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, point)

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

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

typealias Location = CGPointtypealias Distance = Doublefunc distanceBetweenPoint(location: Location,                         toLocation: Location) -> Distance {    let dx = Distance(location.x - toLocation.x)    let dy = Distance(location.y - toLocation.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, point)

同样的代码,在 typealias 的帮助下,读起来就轻松多了。可能单单这个简单例子不会有特别多的体会,但是当遇到复杂的实际问题时,你不再关心并去映射自己代码里那些成堆的 Int 或者 String 这些基本类型到底代表的是什么,会省下不少脑细胞。

对于普通类型并没有什么难点,但是在涉及到泛型时,情况就稍微不太一样。首先,typealias 是单一的,也就是说你必须指定将某个特定的类型通过 typealias 赋值为新名字,而不能将整个泛型类型进行重命名。下面这样的命名都是无法通过编译的:

 这是错误代码
class Person<T> {}typealias Worker = Persontypealias Worker = Person<T>typealias Worker<T> = Person<T>

一旦泛型类型的确定性得到保证后,我们就可以重命名了:

class Person<T> {}typealias WorkId = Stringtypealias Worker = Person<WorkId>

另一个值得一提的是 Swift 中是没有泛型接口的,但是使用 typealias,我们可以在接口里定义一个必须实现的别名,这在一定范围内也算一种折衷方案。比如在 GeneratorType 和 SequenceType 这两个接口中,Swift 都用到了这个技巧,来为接口确定一个使用的类似泛型的特性:

protocol GeneratorType {    typealias Element    mutating func next() -> Element?}protocol SequenceType : _Sequence_Type {    typealias Generator : GeneratorType    func generate() -> Generator}

在实现这些接口时,我们不仅需要实现指定的方法,还要实现对应的 typealias,这其实是一种对于接口适用范围的抽象和约束。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 法院判罚款没有钱怎么办 有人朝你吐口水怎么办 孕妇用了六神花露水怎么办 出车祸人不赔钱怎么办 交通事故对方保险不签字怎么办 肇事车主联系不上怎么办 商标被别人申请无效宣告怎么办 淘宝上传宝贝没有品牌怎么办 萌虎白卡借款2000逾期了怎么办 最里面的牙齿烂了怎么办 金龙沉底不游怎么办 龙鱼尾巴烂了怎么办 微博忘了登录名和密码怎么办 新浪微博密码忘了怎么办 vivo手机用户密码忘了怎么办 微博登录名忘记了怎么办 微信忘记密码钱怎么办 微信密码申诉失败怎么办 微博密码被盗了怎么办 对公密码器丢了怎么办 手机qq忘记旧密码怎么办 qq旧密码忘记了怎么办 微博账户密码忘记了怎么办 三星盖乐世s3忘记密码了怎么办 微博登录密码忘记了怎么办 助学贷款密码忘了怎么办 助学贷款的密码忘了怎么办 助学贷款登录密码忘了怎么办 抖音换了手机登不了怎么办 微信忘记密码申诉失败怎么办 银行卡短信通知没了怎么办 斗鱼手机号被绑定了怎么办 网易邮箱不记得账号怎么办 qq号被盗申诉不回来怎么办 号被盗了申诉不回来怎么办 富士康离职后工资卡号没填怎么办? 填高考志愿时没填电话号码怎么办 铁路12306密码忘了怎么办 微销通提示网络请求失败怎么办 苹果手机出现不停播报情况怎么办 手做俯卧撑抬不起来怎么办