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

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

Swift2.0语言类的嵌套

在一个类中可以嵌套一个或者多个类。它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套。下面依次讲解这两种方式。

Swift2.0语言的直接嵌套

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

图8.6  类的嵌套

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

  • 类1().属性
  • 类1().方法

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

  • 类1.属性
  • 类1.方法

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

  • 类1.类2().属性
  • 类1.类2().方法

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

  • 类1.类2.属性
  • 类1.类2.方法

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

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

  • 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个类,分别为Str1Class、Str2Class、Str3Class。运行结果如下所示:

  • 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类中又嵌套了Str1Class、Str2Class、Str3Class这3个类,它们都会返回一个字符串。代码如下:

  • 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个类,分别为Str1Class、Str2Class、Str3Class。运行结果如下所示:

  • 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人!

时间: 2024-10-08 18:59:20

Swift2.0语言教程之类的嵌套与可选链接的相关文章

Swift2.0语言教程之函数嵌套调用形式

Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还可以调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其他函数:另一种是在一个函数中调用自身函数.以下将对这两种调用进行详细讲解. Swift2.0语言嵌套调用基本形式 嵌套调用是指在函数中可以调用其他函数.调用方式如图7.4所示.   图7.4  函数嵌套的形式 [示例7-25]以下将使用函数的嵌套调用实现对s = 22! + 32!的计算.代码如下: impo

Swift2.0语言教程之下标脚本

Swift2.0语言教程之下标脚本 下标脚本 下标脚本是訪问对象.集合或者序列的高速方式.开发人员不须要调用实例特定的赋值和訪问方法,就能够直接訪问所须要的数值. 比如在数组中,能够直接使用下标去訪问或者改动数组中的某一个元素. 代码例如以下: import Foundation var array=["One","Two","Three","Four","Five"] print("訪问元素:\

Swift2.0语言教程之类的方法

Swift2.0语言教程之类的方法 Swift2.0语言的方法 方法其实就是函数,只不过它被定义在了类中.在Swift中,根据被使用的方式不同,方法分为了实例方法和类型方法两种.这两种方法的定义也和Objective-C是不同的.本节依次讲解这两种方法. Swift2.0语言的实例方法 实例方法被定义在类中,但是由类的实例调用.所以,这类方法被称为实例方法.实例方法和函数一样,分为了不带参数和带参数两种.以下依次讲解这两种方法的使用. 1.不带参数的实例方法 不带参数的实例方法定义和函数的是一样

Swift2.0语言教程之函数的返回值与函数类型

Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有一个返回值的函数 开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回.其中,return语句的一般表示形式如下: return 表达式 其中,表达式可以是符合Swift标准的任意表达式.而具有返回值的函数声明定义形式如下: fu

Swift2.0语言教程之类的属性

Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型--类.它是人们构建代码所用的一种通用.灵活的构造方式.本章将主要详细讲解类的使用. Swift2.0语言的类与对象 类是一种新的数据类型,类似于生活中犬类.猫类等等.而对象则是将这个抽象的类进行了具体化.例如,在犬类中,有哈士奇,金毛等等,这些就是犬类的具体化,即对象.本节将讲解类的创建以及如何将类进行具体化(即实例化)为对象. Swift2

Swift2.0语言教程之闭包

Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语言中的Lambda函数比较相似.在本章中所讲的函数其实就是特殊的闭包.本节主要讲解关于闭包的基本使用. Swift2.0语言闭包表达式 闭包表达式是一种利用简洁语法构建内联(内联类似与C语言中的宏定义)闭包的方式.以下这个代码是对两个字符串的比较. import Foundation //判断两个字

Swift3.0语言教程获取C字符串

Swift3.0语言教程获取C字符串 Swift3.0语言教程获取C字符串,为了让Swift和C语言可以实现很好的交互,开发者可以使用NSString的cString(using:)方法在指定编码格式后,获取C字符串,其语法形式如下: func cString(using: UInt) 其中,using用来指定编码格式. [示例1-19]以下将使用cString(using:)方法获取C字符串. import Foundation var str1=NSString(string:"Hello&

swift2.0中文版教程

有些同学问我要swift的中文版教程,为了节省大家的找资料的时间,我就把我网上下载的PDF放到这里共享好了. 点击链接或者右击选择下载文件进行下载:swift2.0中文版教程 在此也感谢翻译者们的贡献!

Swift3.0语言教程获取字符串编码与哈希地址

Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取字符串编码,分别为availableStringEncodings属性和defaultCStringEncoding属性. (1)availableStringEncodings属性可以用来获取NSString可用的字符串编码.其语法形式如下: class var availableStringEn