Swift2.0语言教程之类的嵌套与可选连接

Swift2.0语言教程之类的嵌套与可选连接

Swift2.0语言类的嵌套

在一个类中能够嵌套一个或者多个类。它们的嵌套形式也是不一样的,大体分为了两种:直接嵌套和屡次嵌套。下面依次讲解这两种方式。ide

Swift2.0语言的直接嵌套

当一个类或者多个类直接嵌套在另一个类,这时就构成直接嵌套,如图8.6所示。post

8.6  类的嵌套spa

在图8.6中,类2、类3和类4都是直接嵌套在类1中。对于这种状况,使用类1的实例属性和方法,语法形式以下:orm

  • 1().属性对象

  • 1().方法教程

使用类1的类型属性和方法的形式以下:ip

  • 1.属性开发

  • 1.方法字符串

使用类2的实例属性和方法,语法形式以下:it

  • 1.2().属性

  • 1.2().方法

使用类2的类型属性和方法的形式以下:

  • 1.2.属性

  • 1.2.方法

3和类4的使用方法相似。

【示例8-21】如下将定义一个直接嵌套的类NewClass,在此类中嵌套了Str1ClassStr2ClassStr3Class3个类,和一个能够输出这3个类中属性内容的方法。在Str1ClassStr2ClassStr3Class这三个类中又定义了类型属性,它们都会返回一个字符串。代码以下:

  • import Foundation

  • class NewClass {

  •     class func printstr(str:String){

  •                print(str)

  • }

  • //Str1Class

  •     class Str1Class{

  •         class var str:String{

  •            return "Swift"

  •         }

  • }

  • //Str2Class

  •     class Str2Class{

  •         class var str:String{

  •            return "Hello"

  •         }

  • }

  • //Str3Class

  •     class Str3Class{

  •         class var str:String{

  •            return "World"

  •         }

  •     }

  • }

  • //调用

  • NewClass.printstr(NewClass.Str1Class.str)

  • NewClass.printstr(NewClass.Str2Class.str)

  • NewClass.printstr(NewClass.Str3Class.str)

在此代码中,在一个NewCllass类中有包含了3个类,分别为Str1ClassStr2ClassStr3Class。运行结果以下所示:

  • Swift

  • Hello

  • World

Swift2.0语言的屡次嵌套

Swift中,类的嵌套不只容许一次嵌套,还容许屡次嵌套。这时的嵌套形式如图8.7所示。

8.7  类的嵌套2

3和类4是直接嵌套在类2中,而类2又直接嵌套在类1。这样造成了多层嵌套。这时,若是访问类1的实例属性和方法,其语法形式以下:

  • 1().属性

  • 1().方法

访问类1的类型属性和方法,其语法形式以下:

  • 1.属性

  • 1.方法

若是要访问类2的实例属性和方法,对应的语法形式以下:

  • 1.2().属性

  • 1.2().方法

访问类2的类型属性和方法,对应的语法形式以下:

  • 1.2.属性

  • 1.2.方法

若是要访问类3的实例属性和方法,对应的语法形式以下:

  • 1.2.3().属性

  • 1.2.3().方法

若是要访问类3的类型属性和方法,对应的语法形式以下:

  • 1.2.3.属性

  • 1.2.3.方法

【示例8-22】如下将定义一个屡次嵌套的类NewClass,在此类中嵌套了StrClass类,和一个能够输出属性内容的方法。在StrClass类中又嵌套了Str1ClassStr2ClassStr3Class3个类,它们都会返回一个字符串。代码以下:

  • import Foundation

  • class NewClass {

  •     class func printstr(str:String){

  •         print(str)

  • }

  • // StrClass

  • class StrClass{

  •     // StrClass1

  •         class Str1Class{

  •             class var str:String{

  •             return "Hello"

  •             }

  •         }

  •         // StrClass2

  •         class Str2Class{

  •             class var str:String{

  •             return "Swift"

  •             }

  •         }

  •         // StrClass3

  •         class Str3Class{

  •             class var str:String{

  •             return "World"

  •             }

  •         }

  •     }

  • }

  • //调用

  • NewClass.printstr(NewClass.StrClass.Str1Class.str)

  • NewClass.printstr(NewClass.StrClass.Str2Class.str)

  • NewClass.printstr(NewClass.StrClass.Str3Class.str)

在此代码中,在一个NewCllass类中有包含了1个类StrClass,在StrClass类中又包含了3个类,分别为Str1ClassStr2ClassStr3Class。运行结果以下所示:

  • Hello

  • Swift

  • World

Swift2.0语言的可选连接

在类或者其余的类型中,声明的属性和变量/常量,都不能够为空。为了解决这一问题,Swift提出了可选类型。经过可选类型定义的元素能够为空或者是不为空,可是如何要使用这些可选类型的值又成为一大难题。Swift接着就提出了可选连接。可选连接能够判断请求或调用的目标(属性、方法、下标脚本等)是否为空。若是目标有值,那么调用就会成功;相反,则返回空(nil)。对于屡次请求或调用的能够被连接在一块儿造成一个链条。Swift中的可选连接和Objective-C中的消息为空相似,可是Swift可使用在任意的类型中使用,而且失败与否能够被检测到。如下将详细讲解可选连接的内容。

Swift2.0语言的可选连接的实现方式

可选连接其实就是使用“?”问号操做符对可选类型实现的一种运算。开发者能够在想要调用的属性、下标脚本和方法的可选值后面添加一个“?”问号来进行可选连接的定义。如下就是对于这些可选连接的定义形式:

  • 属性名?                                                                      //属性的可选连接

  • 下标脚本?                                                                //下标脚本的可选连接

  • 方法名?                                                                    //方法的可选连接

对象可选连接的调用形式以下:

  • 对象名.可选连接

【示例8-23】如下将判断值是否存在,其代码以下:

  • import Foundation

  • class Residence {

  •     //定义一个可选类型的类型属性numberOfRooms

  •     class var numberOfRooms:Int?{

  •         return 100

  •     }

  •     var number:Int?

  • }

  • let newClass=Residence()

  • if let a=Residence.numberOfRooms {                                                    //判断a是否有值

  •     print("目标有值")

  • }else{

  •     print("目标为空")

  • }

  • if let a=newClass.number {                                                                       //可选连接

  •     print("目标有值")

  • }else{

  •     print("目标为空")

  • }

在此代码中,因为umberOfRooms的属性值不为空,因此会出现"目标有值",可是对于number属性来讲,没有赋初值即number属性为nil因此会出现"目标为空"运行结果以下所示:

  • 目标有值

  • 目标为空

注意:在定属性、下标脚本以及方法定义为可选连接时,这些属性、下标脚本和方法都必须是可选类型,不然程序就会出现如下的错误。如如下的代码,是对属性进行的可选连接:

  • import Foundation

  • class NewClass{

  •     var value:Int=10

  • }

  • let newClass=NewClass()

  • let newValue=newClass.value?

  • print(newValue)

因为在此代码中对一个不是可选类型的属性进行了可选连接定义,致使程序出现了如下的错误:

  • Operand of postfix '?' should have optional type; type is 'Int'

Swift2.0语言经过可选连接调用属性、下标脚本、方法

开发者可使用可选连接的可选值来调用属性、下标脚本和方法,并检查这些内容调用是否成功。如下就是经过可选连接调用属性、下标脚本、方法的详细讲解。

1.经过可选连接调用属性

经过可选连接调用属性的语法形式以下:

  • 可选连接.属性名

【示例8-24】如下将经过自判断可选连接来调用属性值,并获取这个属性值。代码以下:

  • import Foundation

  • class Person {

  •     var residence: Residence?

  • }

  • class Residence {

  •     var numberOfRooms = 10

  • }

  • let john = Person()

  • if let roomCount = john.residence?.numberOfRooms {                                                //经过可选连接调用属性

  •     print("John在房子中有 \(roomCount)个房间")

  • } else {

  •     print("没法检索房间数")

  • }

因为john.residence是空,因此这个可选连接就会失败,可是不会出现错误,会返回一个nil。运行结果以下:

  • 没法检索房间数

若是不想返回nil l,开发者须要将john.residence设置为不为空。如如下的代码,将john.residence设置为johnResidence。代码以下:

  • let john = Person()

  • let johnResidence = Residence()

  • john.residence=johnResidence

  • if let roomCount = john.residence?.numberOfRooms {                                                   //经过可选连接调用属性

  •     print("John在房子中有 \(roomCount)个房间")

  • } else {

  •     print("没法检索房间数")

  • }

运行结果以下:

  • John在房子中有 10个房间

2. 经过可选连接调用下标脚本

经过可选连接调用下标脚本的语法形式以下:

  • 可选连接.[下标]

【示例8-25】如下将经过自判断可选连接来调用下标脚本。代码以下:

  • import Foundation

  • class Person {

  •     var residence: Residence?

  • }

  • class Residence {

  •     subscript(i: Int) -> Int {

  •         return i

  •     }

  • }

  • let john = Person()

  • if let firstRoomName = john.residence?[5] {                                                 //经过可选连接调用下标脚本

  •     print("John在房子中有 \(firstRoomName)个房子")

  • } else {

  •     print("没法检索房间数")

  • }

运行结果以下所示:

  • 没法检索房间数

注意:当开发者使用可选链来调用子脚本的时候,你应该将“?”问号放在下标脚本括号的前面而不是后面。可选链的问号通常直接跟在自判断表达语句的后面。不然程序就会出现错误。如如下的代码就将上面的代码作了一下修改,代码以下:

  • let john = Person()

  • if let firstRoomName = john.residence[5]? {                                                     //经过可选连接调用下标脚本

  •     print("John在房子中有 \(firstRoomName)个房子")

  • } else {

  • print("没法检索房间数")

  • }

在此代码中就“?”问号放在了下标脚本括号得后面,致使程序出现了如下的错误:

  • 'Residence?' does not have a member named 'subscript'

3.经过可选连接调用方法

经过可选连接调用方法的语法形式以下:

  • 可选连接.方法

【示例8-26】如下将经过自判断可选连接来调用方法printNumberOfRooms(),此方法的功能是输出numberOfRooms的值。代码以下:

  • import Foundation

  • class Person {

  •     var residence: Residence?

  • }

  • class Residence {

  •     var numberOfRooms=10

  •     func printNumberOfRooms() {

  •         print("The number of rooms is \(numberOfRooms)")

  •     }

  • }

  • let john = Person()

  • if  let a: ()=john.residence?.printNumberOfRooms() {                                                  ////经过可选连接调用方法

  •     print("打印房间数")

  • } else {

  •     print("没法打印房间数")

  • }

运行结果以下:

  • 没法打印房间数

Swift2.0语言中链接多个连接

开发者能够将多个可选连接放在一块儿,如如下的代码,此代码实现的功能是将获取属性street的内容。代码以下:

  • import Foundation

  • // Person类,定义了属性residence

  • class Person {

  •     var residence: Residence?

  • }

  • // Residence类,定义了属性address

  • class Residence {

  •     var address: Address?

  • }

  • // Address类定义了属性street

  • class Address {

  •     var street: String?

  • }

  • //实例化对象

  • let john = Person()

  • let johnsHouse = Residence()

  • john.residence = johnsHouse

  • let johnsAddress = Address()

  • //赋值

  • johnsHouse.address=johnsAddress

  • johnsAddress.street = "Laurel Street"

  • if let johnsStreet = john.residence?.address?.street {                                        //连接了两个可选连接

  •     print("John的地址为: \(johnsStreet)")

  • } else {

  •     print("没法检索地址")

  • }

在此代码中,john.residence如今存在一个实例johnsHouse,而不是nil,而john.residence?.address如今也存在一个实例johnsAddress,并为street设置了实例的值。因此在执行程序后,会返回Street的值。运行结果以下:

  • John的地址为: Laurel Street

本文选自:Swift2.0语言快速入门v3.0 大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

相关文章
相关标签/搜索