Swift入门基础6——扩展、泛型、协议

扩展

Swift中的扩展,对应OC中的分类,可以用它来拓展类的功能。

可以扩展类的什么:

添加新的属性(只能是计算型属性),且也不能为已有的属性添加属性观察器;
添加新方法(实例方法和类方法);
添加新的构造器(只是便利构造器);
甚至还可以在该扩展中使该类符合某个协议,即申明该类遵守某个协议。

注意:
扩展仅可以为类添加新的功能,但不能重写该类原有的方法等。
某类的扩展是可以访问该类的属性方法的。

扩展语法:

extension Int就表示这是对Int类型的扩展。

extension Int {
    var numStr: String {
        get{
            return "\(self)次"
        }
    }
    func printTheNum() {
        print(numStr)
    }
    func repeats(task: ()->Void) {
        for _ in 0..<self {
            task()
        }
    }
}

Int的扩展中,我们首先为Int添加了只读计算型属性numStr,它是以该Int型的数值拼接成的字符串。然后又新添了两个方法。printTheNum()方法的功能是打印numStr属性。repeats(task:)方法有一个参数task,其类型为()->Void,即没有参数没有返回值的闭包!传入该方法的闭包将会被执行该数值次。
调用:

        let num = 2
        num.printTheNum() // log:2次
        num.repeats {
            print("i am your man")
        }
//      log: i am your man
//           i am your man
可变实例方法:

如果在扩展中新添的方法修改了self或者self的属性,则必须以关键字mutating标注。

    mutating func squre() {
        self = self*self
    }

泛型:

什么是泛型?

通俗说一下,就是一个函数,或者类,使用到某个(或多个)参数,这个参数的类型,在设计期间是可供多选的,那么这个函数(类),就称作泛型函数(泛型类)。

泛型约束:

泛型约束就是指定这个泛型使用到的可选类型的选择范围——也就是说指定它必须有的某些特征,因为泛型函数(泛型类)里需要用到这些特征,所以调用方使用泛型时候,指定的可选参数类型也必须具有这些特征。

数字和字典这些集合类就是典型的“泛型”,这些集合可以存放很多类型的数据。如果没有泛型,那想象一下,我们得定义多少种数组初始化的方式。


协议:

协议是什么无需再做解释,直接来看Swift中它的语法:

协议语法:
protocol SomProtocol {
    // 这里是协议要定义的东西
}

在Swift中表示类实现协议和继承是一样的,都用冒号:,若实现多个协议则多个协议之间同样也用逗号隔开。
当一个类既有继承父类,又实现了某协议时。规定冒号后面先是继承的类,然后才是实现的协议。

下面的代码定义了一个StaffModel类,它继承于UserModel,并且还实现了两个协议SomProtocol,OtherProtocol

class StaffModel: UserModel, SomProtocol, OtherProtocol {

}
属性要求:

协议中可以定义对所遵守该协议的类中属性的要求。可以要求属性的类型、名字,以及可读还是可写。

下面定义的协议SomProtocol中定义了所遵守该协议的类中属性的要求。必须要有个叫fullName的,字符串类型的,可读可写的属性。

protocol SomProtocol {
    var fullName: String {get set}
    
}
方法要求:

协议中定义对方法的要求。只有方法的定义,没有对应的方法体。

protocol SomProtocol {
    var fullName: String {get set}
    func nameHandle(fullName: String) -> String
}
构造器要求:

协议中也可以定义对构造器的要求。基本和定义方法是一样。但是在实现该协议的类中实现该构造器时,无论在类中是作为指定构造器还是便利构造器,都要在前面加上required关键字。

protocol SomProtocol {
    var fullName: String {get set}
    init(fullName: String)
    func nameHandle(fullName: String) -> String
}
class StaffModel: UserModel, SomProtocol {
    var fullName: String = "" // SomProtocol协议要求的属性
    required init(fullName: String) { // 协议要求的构造器
        self.fullName = fullName
        super.init()
    }
    func nameHandle(fullName: String) -> String { // 协议要求的方法
        return "fullName:\(fullName)"
    }
}
协议可以作为类型

协议可以作为变/常量、属性、方法参数、集合类元素的类型。表示实现了该协议的任何一种实例。

通过协议实现协议

有时不方便在原类中实现协议,那我们通过扩展来实现协议可以达到一样的效果。

更多请参考:Swift中协议的简单介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,775评论 1 10
  • 扩展 扩展就是向一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类...
    cht005288阅读 460评论 0 0
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,865评论 6 13
  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,452评论 0 4
  • Hello Word 在屏幕上打印“Hello, world”,可以用一行代码实现: 你不需要为了输入输出或者字符...
    restkuan阅读 3,151评论 0 5