swift-多态

  • 前言

swift引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明改变量是使用的类型决定,编译器只认每个变量编译时类型;运行时类型由实际赋给该变量的实例决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism)。

  • 多态性

相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这既是多态。(可以联系继承来理解)
编译时多态:方法重载,都是编译时多态。
运行时多态:p.toString()方法,并不能确定是父类的toString()方法,还是子类的。运行时在确定。

  • 使用is运算符检查类型

is运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是协议,可以把协议理解成一种特殊的类),它用于判断前面的引用变量是否引用后面的类,或者其子类、实现类的实例。如果是,返回true。否则返回false。

  • 使用as运算符向下转型

as:强制将运算符前面的引用变量转换成后面的类型,如果转换失败,程序将导致运行时错误。
as?:可选类型的向下转换。可选值中包含nil。

  1. 向下转换只能在具有继承关系的两个类型之间进行。
  2. 考虑到进行强制类型转换时可能出现异常,因此进行类型转换之前可先通过is运算符来判断是否可以成功转换。这样可以使程序更加健壮。
  3. 当把子类实例赋给父类引用变量时,被称为向上转型,这种转型总是可以成功的。
  • Any和AnyObject

swift为不确定类型提供了两种特殊的类型别名:
1、AnyObject:可代表任何类的实例。
2、Any:可代表任何类型,包括Int、Double等值类型。

  • 嵌套类型

swift允许在一个类型的内部(即{}内部)定义另一个类型,这种机制被称为嵌套类型。
需要说明的是,嵌套类型不允许使用static或class修饰,也就是说,嵌套类型没有所谓的“类型相关的嵌套类型”。

提示:
在Java语言中,与嵌套类型类似的机制被称为内部类;在C++语言中,与嵌套类型类似的机制被称为嵌套类。

  • 扩展

扩展是swift的一种动态特征,swift允许使用扩展为现有的类添加新方法,并且不需要创建子类,不需要访问原有类的源代码。但因为扩展不是派生子类,所以扩展不支持重写。
扩展的定义语法为:

[修饰符] extension 已有类型
{
      //添加新功能
}

上面的修饰符可以忽略。
若需通过扩展让已有的类型遵守一个或多个协议,语法格式如下:

[修饰符] extension 已有类型: 协议1, 协议2
{
      //实现协议方法
}
  • 协议

用于定义多个类型应该遵守的规范。swift协议的作用,就相当于其他语言中接口的作用。
语法格式如下:

[修饰符] protocol 协议名: 父协议1, 父协议2
{
      //协议内容
}

合成协议:
swift允许将多个协议合成一个临时的类型,这种用法被称为合成协议。
语法格式如下:

protocol <父协议1, 父协议2, ...>

唯类(Class-Only)协议:
这种协议只能被类实现,不能被枚举、结构体实现。其定义方式,只要在定义协议的协议名后的冒号后面添加class关键字即可(class放在所有父协议的第一位)。
语法格式如下

protocol 协议名: 父协议1, 父协议2
{
      //唯类协议的定义
}

可选协议:
可以选择不实现的协议。可选协议必须添加@objc修饰,协议成员前添加optional关键字即可定义可选协议。可选协议一定是唯类协议(因为它只能被类实现,不能被枚举、结构体实现)。

注意:

  1. 协议支持形参个数可变的方法,但不支持为形参指定默认值。
  2. 如果协议中定义的方法没有使用mutating修饰(没有变成可变方法),枚举、结构体实现该协议,并实现该方法是就不能添加mutating。简单的说,可变、非可变方法都可实现协议中的可变方法;但只有非可变方法才能实现协议中的非可变方法。
  3. 协议能要求实现者必须提供哪些下标,也能要求该下标是否有setter部分和getter部分。
  4. 只有使用类实现协议中定义的构造器时,才需要使用required;使用枚举、结构体实现协议中的构造器则没有这些要求。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,794评论 1 10
  • Hello Word 在屏幕上打印“Hello, world”,可以用一行代码实现: 你不需要为了输入输出或者字符...
    restkuan阅读 3,175评论 0 6
  • 一直没有时间好好看一下swift,最近复习了一遍语法,这里记录swift学习过程中遇到的一些问题和要点,和Obje...
    bomo阅读 2,347评论 0 25
  • 常量与变量使用let来声明常量,使用var来声明变量。声明的同时赋值的话,编译器会自动推断类型。值永远不会被隐式转...
    莫_名阅读 448评论 0 1
  • 扩展 扩展就是向一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类...
    cht005288阅读 465评论 0 0