当前位置:K88软件开发文章中心编程语言APP编程Swift01 → 文章内容

Swift 可选链

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:31:26

} }}let john = Person()if let firstRoomName = john.residence?[0].name { print("第一个房间名 \(firstRoomName).")} else { print("无法检索到房间")}以上程序执行输出结果为:无法检索到房间在下标脚本调用中可选链的问号直接跟在 circname.print 的后面,在下标脚本括号的前面,因为circname.print是可选链试图获得的可选值。实例2实例中创建一个Residence实例给john.residence,且在他的rooms数组中有一个或多个Room实例,那么你可以使用可选链通过Residence下标脚本来获取在rooms数组中的实例了:class Person { var residence: Residence?}// 定义了一个变量 rooms,它被初始化为一个Room[]类型的空数组class Residence { var rooms = [Room]() var numberOfRooms: Int { return rooms.count } subscript(i: Int) -> Room { return rooms[i] } func printNumberOfRooms() { print("房间号为 \(numberOfRooms)") } var address: Address?}// Room 定义一个name属性和一个设定room名的初始化器class Room { let name: String init(name: String) { self.name = name }}// 模型中的最终类叫做Addressclass Address { var buildingName: String? var buildingNumber: String? var street: String? func buildingIdentifier() -> String? { if (buildingName != nil) { return buildingName } else if (buildingNumber != nil) { return buildingNumber } else { return nil } }}let john = Person()let johnsHouse = Residence()johnsHouse.rooms.append(Room(name: "客厅"))johnsHouse.rooms.append(Room(name: "厨房"))john.residence = johnsHouselet johnsAddress = Address()johnsAddress.buildingName = "The Larches"johnsAddress.street = "Laurel Street"john.residence!.address = johnsAddressif let johnsStreet = john.residence?.address?.street { print("John 所在的街道是 \(johnsStreet)。")} else { print("无法检索到地址。 ")}以上程序执行输出结果为:John 所在的街道是 Laurel Street。通过可选链接调用来访问下标通过可选链接调用,我们可以用下标来对可选值进行读取或写入,并且判断下标调用是否成功。实例class Person { var residence: Residence?}// 定义了一个变量 rooms,它被初始化为一个Room[]类型的空数组class Residence { var rooms = [Room]() var numberOfRooms: Int { return rooms.count } subscript(i: Int) -> Room { return rooms[i] } func printNumberOfRooms() { print("房间号为 \(numberOfRooms)") } var address: Address?}// Room 定义一个name属性和一个设定room名的初始化器class Room { let name: String init(name: String) { self.name = name }}// 模型中的最终类叫做Addressclass Address { var buildingName: String? var buildingNumber: String? var street: String? func buildingIdentifier() -> String? { if (buildingName != nil) { return buildingName } else if (buildingNumber != nil) { return buildingNumber } else { return nil } }}let john = Person()let johnsHouse = Residence()johnsHouse.rooms.append(Room(name: "客厅"))johnsHouse.rooms.append(Room(name: "厨房"))john.residence = johnsHouseif let firstRoomName = john.residence?[0].name { print("第一个房间名为\(firstRoomName)")} else { print("无法检索到房间")}以上程序执行输出结果为:第一个房间名为客厅访问可选类型的下标如果下标返回可空类型值,比如Swift中Dictionary的key下标。可以在下标的闭合括号后面放一个问号来链接下标的可空返回值:var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]testScores["Dave"]?[0] = 91testScores["Bev"]?[0]++testScores["Brian"]?[0] = 72// the "Dave" array is now [91, 82, 84] and the "Bev" array is now [80, 94, 81]上面的例子中定义了一个testScores数组,包含了两个键值对, 把String类型的key映射到一个整形数组。这个例子用可选链接调用把"Dave"数组中第一个元素设为91,把"Bev"数组的第一个元素+1,然后尝试把"Brian"数组中的第一个元素设为72。前两个调用是成功的,因为这两个key存在。但是key"Brian"在字典中不存在,所以第三个调用失败。连接多层链接你可以将多层可选链连接在一起,可以掘取模型内更下层的属性方法和下标脚本。然而多层可选链不能再添加比已经返回的可选值更多的层。 如果你试图通过可选链获得Int值,不论使用了多少层链接返回的总是Int?。 相似的,如果你试图通过可选链获得Int?值,不论使用了多少层链接返回的总是Int?。实例1下面的例子试图获取john的residence属性里的address的street属性。这里使用了两层可选链来联系residence和address属性,它们两者都是可选类型:class Person { var residence: Residence?}// 定义了一个变量 rooms,它被初始化为一个Room[]类型的空数组class Residence { var rooms = [Room]() var numberOfRooms: Int { return rooms.count } subscript(i: Int) -> Room { return rooms[i] } func printNumberOfRooms() { print("房间号为 \(numberOfRooms)") } var address: Address?}// Room 定义一个name属性和一个设定room名的初始化器class Room { let name: String init(name: String) { self.name = name }}// 模型中的最终类叫做Addressclass Address { var buildingName: String? var buildingNumber: String? var street: String? func buildingIdentifier() -> String? { if (buildingName != nil) { return buildingName } else if (buildingNumber != nil) { return buildin

上一页  [1] [2] [3]  下一页


Swift 可选链