首页 > 代码库 > Swift语言中的属性,方法,下标脚本以及继承

Swift语言中的属性,方法,下标脚本以及继承


从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并不是太多。理解Swift的面向对象理念,语法以及类结构,构造析构过程对于很好的应用Swift语言将会有比较大的帮助。


属性


存储属性

存储属性通常是那些可以通过直接赋值,或者直接访问成员能够获得的属性类型。
它有些要注意的地方:
若一个结构体被声明为常量,则子属性无法被修改了。在Objective-C中,我们总是无法修改结构体的子属性,但是swift却可以,不过这种情况是个例外,当你存储型属性是个结构体并且是个常量,那你就不要再试图去修改这个结构体的子属性了。
而类属于引用类型,即使声明为常量我们也可以修改。

延迟加载存储属性

延迟加载我们又称为懒加载,在Swift中提供了一个@lazy用于声明懒加载的属性.
@lazy修饰的属性必须为变量,因为通常常量属性我们必须在构造完成前赋值,基于这一特性,无法对常量进行懒加载。



这里我们在调用其函数时才对dataList进行访问,而访问的时候再根据它是否创建过进行是否加载的决定。


计算属性

计算型属性通常不直接存储值,通过getter来获取值,setter来间接设置其他属性或者变量的值。


结构体rect中,中点center就是通过对自己原点和尺寸数据的计算得来的。
而area变量则是只声明了get方法,我们默认其为只读计算型属性。
其实我们只读计算型属性也可以省略掉get{}

var area: Double {returnsize.width *size.height }



属性监视器


在Objective-C中,我们有KVO机制来灵活的监视属性变化,在Swift则用属性监视器来实现。
willSet{} 设置新值前系统回调,若不指名参数名称,则新值用newValue表示
didSet{}  设置完成后系统回调,若不指名,提供之前值oldValue。



简单的计步器类,在设值前后进行了控制台的输出。
注意这里用到了单例,不过貌似苹果目前还没有关于Swift的单例实践的推荐方式。

注意这里shared变量使用了class关键字进行修饰,而结构体Inner中的变量使用了static修饰。这两者分别在类或者值类型中表示类型属性,所有实例共享这一属性。


方法


同Ojbective-C相似,Swift也有类方法和实例方法,使用也很简单,实例直接声明func即可,类则需要用class修饰。但是有时我们更喜欢称它为函数。


变异(mutating)

一般情况下,值类型的属性不能在它的实例方法中进行修改,引用也一样,如果要修改需要在方法前用mutating关键字进行修饰。


这里这个函数我们需要对刚才定义过的点结构体进行扩展,扩展中修改了其属性,所以需要将函数加mutating修饰。

在变异方法中我们同样可以给self赋值。


一个简单的枚举,在next()函数中完成了对self的切换。

类方法


上面提到过,类方法值类型如结构体使用static,而引用类型,例如类则使用class。



这里使用类方法完成了一个简单的工厂方法,其实在Swift中,若是简单的对属性赋值,我们可以使用便捷(自定义)构造器来完成,这点以后写到构造器时会讲到。
另外如果我们在没有实例时,例如在类方法中,使用了self,则self指向这个类型而不是实例。例如Objective-C中的[[self alloc] init]写法。


下标脚本(subscripts)


这个概念在Objective-C中并没有,我们说Swift语法比较灵活和强大,在于它对结构体,枚举,函数的强大功能进行了扩展和支持,例如函数在Swift中属于First-Class级别。

在这里,下标脚本通常可以用于定义在类,结构体和枚举中,我们可以自定义快捷的访问方式通过使用下标脚本。对于同一个目标我们可以通过对其函数重载的方式定义多重方式的下标脚本访问。

基本语法和使用:





定义了一个三倍计算结构体常量,然后传入索引并获取脚本计算得到的值。

不过需要注意的是,下标脚本参数不允许设置默认值,不允许使用inout对参数进行修改。
一个简单的例子:



这里我们通过下标能快速的访问这个类实例持有的数据列表相应位置上的值,而不需要在访问时每次都要写一次访问其持有的数组在访问相应的obj。


继承


在Swift中,继承是区分”类”和其它类型的一个基本特征。

基类


不同于OC中的NSObject,Swift中的类并不是从一个通用的基类继承而来的。
但是很多功能Swift通过提供标准库来实现。

子类生成


直接通过 ":"来标识继承关系。
子类试图修改那些继承来的属性时需要先对他们进行初始化。


重写


使用override关键字

在重写属性时,必须将名字和类型全写出来,才能使编译器去检查你重写的属性是否与超类匹配。
你可以将只读属性重写为可读写,但是不能将可读写(readwrite)重写为只读(readonly)。

另外我们可以重写属性观察器,但不可以为只读属性及已有setter的属性重写观察器。

同JAVA一样,若防止重写则用@final声明为最终版本。



以上就是本篇博客的全部内容,欢迎联系本人进行讨论和勘误。