从这篇章节起,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变量使用了classkeyword进行修饰,而结构体Inner中的变量使用了static修饰。这两者分别在类或者值类型中表示类型属性,全部实例共享这一属性。


方法


同Ojbective-C相似,Swift也有类方法和实例方法,使用也非常easy,实例直接声明func就可以,类则须要用class修饰。可是有时我们更喜欢称它为函数。


变异(mutating)

普通情况下,值类型的属性不能在它的实例方法中进行改动,引用也一样,假设要改动须要在方法前用mutatingkeyword进行修饰。


这里这个函数我们须要对刚才定义过的点结构体进行扩展,扩展中改动了其属性,所以须要将函数加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通过提供标准库来实现。

子类生成


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


重写


使用overridekeyword

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

另外我们能够重写属性观察器,但不能够为仅仅读属性及已有setter的属性重写观察器。

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



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

Swift的属性,方法,下标脚本以及继承的更多相关文章

  1. 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  2. Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  3. swift具体解释之八---------------下标脚本

    swift具体解释之八-----下标脚本 下标脚本 能够定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中.能够觉得是訪问对象.集合或序列的快捷方式.不须要 ...

  4. swift学习笔记之-下标脚本

    //下标脚本subscript import UIKit /*下标脚本(Subscripts) 下标脚本: 1.可以定义在类(Class).结构体(structure)和枚举(enumeration) ...

  5. Swift学习笔记(15)--下标脚本(Subscripts)

    下标脚本可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,使用中类似数组或者字典的用法 1.定义 定义下标脚本使用subscript关键字,语法: s ...

  6. Swift - 下标脚本方法介绍及实例

    定义下标脚本之后,可以使用“[]”来存取数据类型的值. 示例1:实现一个我们自定的字符串类,可以方便的通过索引获取某一个字符值,或某一部分字符串.同时也可以通过索引,给某一部分赋值. 1 2 3 4 ...

  7. Swift—下标脚本(Subscripts)

    下标脚本可以定义在类(Class).结构体(Struct).枚举(enumeration)这些目标中,可以认为是访问集合,列表或序列的快捷方式,使用下标脚本的索引设置和获取值,不需要再调用实例的特定的 ...

  8. iOS - Swift Subscript 下标脚本

    1.Subscript 下标脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值.语法类似于实例方法和计算型属性的混合.与定义实例方法类似,定义下标脚本使用 subscri ...

  9. Swift 下标脚本

    前言 在访问一个数组实例的元素时,可以使用 Array[index] 的形式.在访问一个字典实例的元素时,可以使用 Dictionary[index] 的形式.这种方括号的形式就是 "下标脚 ...

随机推荐

  1. delphi之完美Splash方案(在TfrmMain.FormCreate里不断调用TfrmSplash显示加载进度文字,并且及时Update显示)

    前言:网上有很多介绍delphi创建闪屏的代码,大多只是在程序开启前显示一个闪屏,但是却没有说如何在闪屏上显示程序加载的进度,于是笔者有意思介绍一下这种闪屏方式. 1.创建一个窗体(TfrmSplas ...

  2. PHP之操作数据库

    数据库,顾名思义,是一个存放数据的容器.然后在使用过程中对数据库里面的数据增删改查,具体是怎么实现的呢? 这儿不得不提一下一个神奇的东西:SQL语句:结构化查询语言(Structured Query ...

  3. 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf

    引言:假设想把一个字符串读到程序中.必须首先预留存储字符串的空间.然后使用输入函数来获取这个字符串. 读取字符串输入的第一件事是建立一个空间以存放读入的字符串. char *name; scanf(& ...

  4. android之LruCache源代码解析

    移动设备开发中,因为移动设备(手机等)的内存有限,所以使用有效的缓存技术是必要的.android提供来一个缓存工具类LruCache,开发中我们会经经常使用到,以下来他是怎样实现的. 在package ...

  5. iOS - NSLog的使用方法

    NSLog的定义 NSLog定义在NSObjCRuntime.h中,如下所示: void NSLog(NSString *format, …); 基本上,NSLog很像printf,同样会在conso ...

  6. gant

    http://gant.github.io/ http://gant.codehaus.org/

  7. 14.3.4 Phantom Rows 幻影行

    14.3.4 Phantom Rows 幻影行 所谓的幻读为发生在一个事务 当相同的查询产生不同的结果集在不同的时间. 比如,如果一个SELECT被执行2次, 但是第2次返回的记录不是第一次返回的记录 ...

  8. hadoop集群空间使用情况报告脚本

    近期集群空间有点紧张,总是操心空间不足而崩溃,近期扩容又不太现实,经与集群用户沟通发现:集群上存储了非常多没用的历史数据,能够删除,这样就能够通过一个crontab脚本每天生成集群空间使用报告,当使用 ...

  9. facebook打开动画pop

    POP源代码:https://github.com/facebook/pop demo相关链接:https://github.com/jxd001/POPdemo/blob/master/README ...

  10. POJ 2318 TOYS(计算几何)

    跨产品的利用率推断点线段向左或向右,然后你可以2分钟 代码: #include <cstdio> #include <cstring> #include <algorit ...