类如果要访问类3的实例属性和方法,对应的语法形式如下:
如果要访问类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。运行结果如下所示:
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{ //可选链接
")
}
在此代码中,由于umberOfRooms的属性值不为空,所以会出现"目标有值",但是对于number属性来说,没有赋初值即number属性为nil,所以会出现"目标为空"运行结果如下所示:
注意:在定属性、下标脚本以及方法定义为可选链接时,这些属性、下标脚本和方法都必须是可选类型,否则程序就会出现以下的错误。如以下的代码,是对属性进行的可选链接:
由于在此代码中对一个不是可选类型的属性进行了可选链接定义,导致程序出现了以下的错误:
Swift2.0语言通过可选链接调用属性、下标脚本、方法
开发者可以使用可选链接的可选值来调用属性、下标脚本和方法,并检查这些内容调用是否成功。以下就是通过可选链接调用属性、下标脚本、方法的详细讲解。
1.通过可选链接调用属性
通过可选链接调用属性的语法形式如下:
【示例8-24】以下将通过自判断可选链接来调用属性值,并获取这个属性值。代码如下:
import Foundation
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 10
}
let john = Person()
if letroomCount = 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 { //通过可选链接调用属性
运行结果如下:
2.通过可选链接调用下标脚本
通过可选链接调用下标脚本的语法形式如下:
【示例8-25】以下将通过自判断可选链接来调用下标脚本。代码如下:
import Foundation
class Person {
var residence: Residence?
}
class Residence {
subscript(i: Int) -> Int {
return i
}
}
let john = Person()
iflet firstRoomName = john.residence?[5]{ //通过可选链接调用下标脚本
(firstRoomName)个房子运行结果如下所示:
注意:当开发者使用可选链来调用子脚本的时候,你应该将“?”问号放在下标脚本括号的前面而不是后面。可选链的问号一般直接跟在自判断表达语句的后面。否则程序就会出现错误。如以下的代码就将上面的代码做了一下修改,代码如下:
在此代码中就“?”问号放在了下标脚本括号得后面,导致程序出现了以下的错误:
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("打印房间数 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"
iflet johnsStreet = john.residence?.address?.street{ //链接了两个可选链接
print("John的地址为: (johnsStreet)")
} else {
print("无法检索地址在此代码中,john.residence现在存在一个实例johnsHouse,而不是nil,而john.residence?.address现在也存在一个实例johnsAddress,并为street设置了实例的值。所以在执行程序后,会返回Street的值。运行结果如下:
本文选自:Swift2.0语言快速入门v3.0大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!