笔记摘要(十三)--Swift3.0之扩展&协议&泛型

扩展

扩展可以为一个类型添加新的功能,但是不能重写已有的功能。

  • 使用关键字extension来声明扩展。

  • 计算型属性

    • 扩展可以为已有类型添加计算型实例属性和计算型类型属性。

    • 扩展可以添加新的计算型属性,但是不可以添加存储型属性,也不可以为已有属性添加属性观察器。

  • 构造器

    • 扩展能为类添加新的便利构造器,但是不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。

    • 如果你是用扩展提供了一个新的构造器,你依旧有责任确保构造过程能够让实例完全初始化。

  • 方法

    扩展可以为已有类型添加新的实例方法和类型方法。

  • 下标

    扩展可以为已有类型添加新下标。

协议

  • 属性要求

    • 协议总是用var关键字来声明变量属性,在类型声明后加上{ set get }来表示属性是可读可写的,可读属性则用{ get }来表示。

      protocol SomeProtocol{    
          var mustBeSettable: Int { get set}   
          var doesNotNeedToBeSettable: Int { get }
      }
      
    • 在协议中定义类型属性时,总是使用static关键字作为前缀。

  • 方法要求

    不支持为协议中的方法的参数提供默认值。

  • Mutating方法要求

    实现协议中的mutating方法时,若是类类型,则不用写mutating关键字。而对于结构体和枚举,则必须写mutating关键字。

  • 构造器要求

    • 在协议的定义里写下构造器的声明,但不需要写花括号和构造器的实体。

    • 构造器要求在类中的实现,必须标上required修饰符。使用此修饰符可以确保所有子类也必须提供此构造器实现,从而也能符合协议。

    • 如果类已经被标记为final,那么不需要在协议构造器的实现中使用required修饰符,因为final类不能有子类。

    • 如果一个子类重写了父类的指定构造器,并且该构造器满足了某个协议的要求,那么该构造器的实现需要同时标注required 和 override修饰符。

  • 通过扩展添加协议一致性

    通过扩展令已有类型采纳并符合协议时,该类型的所有实例也会随之获得协议中定义的各项功能。

  • 通过扩展采纳协议

    • 当一个类型已经符合了某个协议中的所有要求,却还没有声明采纳该协议时,可以通过空扩展体的扩展来采纳该协议。
    • 即使满足了协议的所有要求,类型也不会自动采纳协议,必须显式的采纳协议。
  • 类类型专属协议

    可以在协议的继承列表中,通过添加class关键字来限制协议只能被类类型采纳,而结构体或枚举不能采纳该协议。class关键字必须第一个出现在协议的继承列表中,在其他继承的协议之前。

  • 协议合成

    • 可以罗列任意多个想要采纳的洗衣,并以 与符号(&)分隔。

    • 协议合成并不会生成新的、永久的协议类型,而是将多个协议中的要求合成到一个只在局部作用域有效的临时协议中。

  • 检查协议一致性

    可以使用类型转换中描述的is和as操作符来检查协议一致性,即是否符合某协议,并且可以转换到指定的协议类型。

  • 可选的协议要求

    可选的协议要求只能用在标记@objc特性的协议中。该协议表示协议将暴露给OC代码。即使你不打算和OC有什么交互,如果你想要指定可选的协议要求,那么还是要为协议加上@objc特性。标记@objc特性的协议只能被继承自OC类的类或者@objc类采纳,其他类以及结构体和枚举均不能采纳这种协议。

optional关键字前也需要添加@objc

    import Foundation
    @objc protocol CounterDataSource{    
       @objc optional func incrementForCount(count: Int) 
             ->  Int    
       @objc optional var fixedIncrement: Int{ get }
    }
  • 协议扩展

    • 通过协议扩展,所有采纳协议的类型,都能自动获得这个扩展所增加的方法实现,无需任何额外修改。
    • 通过协议扩展为协议要求提供的默认实现和可选的协议要求不同。如果采纳协议的类型为这些要求提供了自己的实现,那么这些自定义实现将会替代扩展中的默认实现被使用。
    • 如果多个协议扩展都为同一个协议要求提供了默认实现,而采纳协议的类型又同时满足这些协议扩展的限制条件,那么将会使用限制条件最多的那个协议扩展提供的默认实现。

泛型

  • 类型参数

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

  • 命名类型参数

    请始终使用大写字母开头的驼峰命名法,以表明它们是占位类型,而不是一个值。

  • 关联类型

    通过关键字 associated type来指定关联类型。

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

推荐阅读更多精彩内容