美文网首页
每天学一点Swift----面向对象下(六)

每天学一点Swift----面向对象下(六)

作者: 冯可乐同学 | 来源:发表于2017-06-10 21:17 被阅读3次

六.协议

1. Swift协议作用完全类似于Objective-C的协议,用于定义多个类型应该遵守的规范。----本质和Java中的接口相同。

2.类是一种具体的实现体。而协议定义了一种规范,协议定义某一批类所需要遵守的规范,协议不关心这些类的内部状态数据,也不关心这些类里方法的具体实现细节。它只是规范这批类里必须提供某些方法,提供这些方法的类就可满足实际需求。

3.协议不提供任何实现。协议体现的是规范和实现分离的设计哲学,是一种松耦合的设计。

4.协议定义的是多个类型共同的公共行为规范,这些行为是与外部交流的通道,协议统一了属性名、方法名和下标等,但协议并不提供任何实现。实现协议的类型都称为协议的实现者(遵守者),协议实现者必须提供协议要求的属性、方法、构造器和下标等。

5.定义协议的语法格式如下:

[修饰符] protocol协议名:父协议1,父协议2,...

{

//协议内容,就是指定协议实现者必须提供的那些功能,比如属性,方法,下标等。

}

6.一个协议可以有多个直接父协议,但是协议只能继承协议,不能继承类。

7.实现协议的语法也很简单:只要在类、结构体、枚举的名称后加上要实现的协议名,中间以英文冒号隔开即可。一个类型可以实现多个协议,多个协议之间用英文逗号隔开。例如:

struct结构体名:FirstProtocol,SecondProtocol,...

{

//实现协议要求

}

8.对于类来说,不仅可以实现协议,还可以继承父类,这时,只要把父类名称放在类名后面第一个位置即可。

七.协议指定的属性要求

1.协议可以要求实现者必须提供包含特定名称的实例属性或类型属性,也能要求改属性是否有setter和getter部分。但至于该属性究竟是存储属性还是计算属性,协议并不关心。

2.在协议中定义属性要求的语法格式如下:

[class] var属性名:类型{get[set]}

3.此处只要写get、set即可,无须提供实现。其中,set可有可无。如果有set,则要求该实现者必须提供与之匹配的读写属性;如果没有set,则只要求该实现者提供与之匹配的只读属性。当协议中定义了只读属性时,协议实现者提供了读写属性也是允许的。

4.协议并不支持嵌套类型。

5.当时用枚举、结构体实现协议中的类型属性时,枚举、结构体依然呀使用static修饰类型属性,而不是用class。

6.使用类实现协议时与使用枚举、结构体实现协议基本相同,只是使用类实现协议的类型存储属性时,不时使用关键字static,而是使用class关键字。

八.协议指定的方法要求

1.协议能要求实现者必须实现哪些实例方法和类型方法,在协议中声明方法与普通方法的声明基本相同,只是在协议中声明的方法不需要实现方法体,即有圆括号,没有方括号。————和Java接口中声明方法相同。

2.协议支持形参个数可变的方法,但不支持形参指定为默认值。

九.协议指定的可变方法要求

1.如果枚举、结构体需要定义能改变该实例数据的方法,则需要将该方法定义为可变方法(使用mutating修饰);类则不存在可变方法,因为类是引用类型的,类中的方法就可以改变实例的数据。

2.使用枚举、结构体来实现该协议中的可变方法时,也需要使用mutating修饰,但使用类实现该协议中的可变方法时,则无须使用mutating修饰。

3.如果协议中的方法没有使用mutating修饰,那么枚举、结构体在实现协议中的方法时就不能添加mutating。简单来说,可变、非可变方法都可以实现协议中的可变方法,但只有非可变方法才能实现协议中的非可变方法。

十.协议指定的下标要求

1.协议能要求实现者必须提供哪些下标,也能要求该下标是否有setter和getter部分。。

2.在协议中定义下标要求的语法为:

subscript(形参列表) ->返回值{get[set]}

此处仍然只需要写get、set即可,不需要提供实现。其中,set可有可无,如果有set,则要求实现者必须要提供与之匹配的读写下标;如果没有set,则要求实现者必须提供至少有只读属性的下标。

十一.协议指定的构造器要求

1.协议能要求实现者必须提供哪些构造器,在协议中声明构造器与普通构造器的声明基本相同,只是在协议中声明的构造器不需要后面的花括号部分。

2.由于枚举、结构体的构造器比较简单,因此使用枚举或结构体实现协议,并实现协议中的构造器时,没有什么特别注意的地方。

3.当使用类实现协议,并实现协议中的构造器时,既可以使用指定构造器来实现,也可以使用便利构造器来实现,协议并不关心,但要注意如下两点:

(1)使用类实现协议,并实现协议中的构造器时,必须使用required修饰该构造器。除非该类使用了final修饰(该类不能派生子类),此时可以省略构造器required。

(2)使用类实现协议,并实现协议中的构造器时,如果该构造器还重写了其父类的构造器,则必须同时使用required override修饰。

4.只有使用类实现协议中定义的构造器时,才需要使用required,使用枚举、结构体实现协议中的构造器则没有这些要求。

5.需要注意的是:协议也支持定义可能失败的构造器要求。如果在协议中定义了可能失败的构造器,那么遵守该协议的类既可以使用可能失败的构造器来实现该构造器要求,也可以使用普通构造器来实现构造器要求;反过来,如果在协议中定义了普通的构造器,那么遵守该协议的类则只能使用普通的构造器来实现该构造器要求,或者使用支持隐式解析的可能失败的构造器来实现该构造器要求。

相关文章

网友评论

      本文标题:每天学一点Swift----面向对象下(六)

      本文链接:https://www.haomeiwen.com/subject/tyycqxtx.html