Swift4.2语言规范(十八) 可选链接
可选链接是一个查询和调用当前可选的可选项的属性,方法和下标的过程 注意 Swift中的可选链接类似于 可选链接作为强制解包的替代方法您可以通过 要反映可以在 具体来说,可选链接调用的结果与预期返回值的类型相同,但包含在可选中。通常返回an的属性 接下来的几个代码片段演示了可选链接与强制解包的区别,并使您能够检查是否成功。 首先,调用 1 class Person { 2 var residence: Residence? 3 } 4 5 class Residence { 6 var numberOfRooms = 1 7 }
如果您创建一个新 let john = Person() 如果您尝试访问 1 let roomCount = john.residence!.numberOfRooms 2 // this triggers a runtime error 如果 可选链接提供了一种访问其值的替代方法 1 if let roomCount = john.residence?.numberOfRooms { 2 print("John‘s residence has (roomCount) room(s).") 3 } else { 4 print("Unable to retrieve the number of rooms.") 5 } 6 // Prints "Unable to retrieve the number of rooms." 这告诉Swift在可选 由于尝试访问 请注意,即使这 您可以将 john.residence = Residence()
1 if let roomCount = john.residence?.numberOfRooms { 2 print("John‘s residence has (roomCount) room(s).") 3 } else { 4 print("Unable to retrieve the number of rooms.") 5 } 6 // Prints "John‘s residence has 1 room(s)." 为可选链接定义模型类您可以使用可选链接来调用超过一级深度的属性,方法和下标。这使您可以深入查看相互关联类型的复杂模型中的子属性,并检查是否可以访问这些子属性上的属性,方法和下标。 下面的代码片段定义了四个模型类,用于几个后续示例,包括多级可选链接的示例。这些类在所述展开 该 1 class Person { 2 var residence: Residence? 3 } 这 1 class Residence { 2 var rooms = [Room]() 3 var numberOfRooms: Int { 4 return rooms.count 5 } 6 subscript(i: Int) -> Room { 7 get { 8 return rooms[i] 9 } 10 set { 11 rooms[i] = newValue 12 } 13 } 14 func printNumberOfRooms() { 15 print("The number of rooms is (numberOfRooms)") 16 } 17 var address: Address? 18 } 因为此版本的 作为访问其 此版本 最后, 在 1 class Room { 2 let name: String 3 init(name: String) { self.name = name } 4 } 调用此模型中的最后一个类 1 class Address { 2 var buildingName: String? 3 var buildingNumber: String? 4 var street: String? 5 func buildingIdentifier() -> String? { 6 if let buildingNumber = buildingNumber,let street = street { 7 return "(buildingNumber) (street)" 8 } else if buildingName != nil { 9 return buildingName 10 } else { 11 return nil 12 } 13 } 14 } 所述 通过可选链接访问属性如可选链接作为强制解包的替代方法所示,您可以使用可选链接访问可选值的属性,并检查该属性访问是否成功。 使用上面定义的类来创建新 1 let john = Person() 2 if let roomCount = john.residence?.numberOfRooms { 3 print("John‘s residence has (roomCount) room(s).") 4 } else { 5 print("Unable to retrieve the number of rooms.") 6 } 7 // Prints "Unable to retrieve the number of rooms." 由于 您还可以尝试通过可选链接设置属性的值: 1 let someAddress = Address() 2 someAddress.buildingNumber = "29" 3 someAddress.street = "Acacia Road" 4 john.residence?.address = someAddress 在此示例中,尝试设置 赋值是可选链接的一部分,这意味着不会对 1 func createAddress() -> Address { 2 print("Function was called.") 3 4 let someAddress = Address() 5 someAddress.buildingNumber = "29" 6 someAddress.street = "Acacia Road" 7 8 return someAddress 9 } 10 john.residence?.address = createAddress() 您可以判断该 通过可选链接调用方法您可以使用可选链接在可选值上调用方法,并检查该方法调用是否成功。即使该方法没有定义返回值,也可以执行此操作。 在 1 func printNumberOfRooms() { 2 print("The number of rooms is (numberOfRooms)") 3 } 此方法未指定返回类型。但是,没有返回类型的函数和方法具有隐式返回类型 如果在带有可选链接的可选值上调用此方法,则方法的返回类型将 1 if john.residence?.printNumberOfRooms() != nil { 2 print("It was possible to print the number of rooms.") 3 } else { 4 print("It was not possible to print the number of rooms.") 5 } 6 // Prints "It was not possible to print the number of rooms." 如果您尝试通过可选链接设置属性,情况也是如此。通过可选链接访问属性中的上述示例尝试设置 1 if (john.residence?.address = someAddress) != nil { 2 print("It was possible to set the address.") 3 } else { 4 print("It was not possible to set the address.") 5 } 6 // Prints "It was not possible to set the address." 通过可选链接访问下标您可以使用可选链接尝试从可选值的下标中检索和设置值,并检查该下标调用是否成功。 注意 通过可选链接访问可选值的下标时,将问号放在下标括号之前,而不是之后。可选的链接问号始终紧跟在表达式的可选部分之后。 下面的示例尝试使用类上定义的下标检索属性 1 if let firstRoomName = john.residence?[0].name { 2 print("The first room name is (firstRoomName).") 3 } else { 4 print("Unable to retrieve the first room name.") 5 } 6 // Prints "Unable to retrieve the first room name." 此下标调用中的可选链接问号紧跟 同样,您可以尝试通过带有可选链接的下标设置新值: john.residence?[0] = Room(name: "Bathroom") 此下标设置尝试也失败,因为 如果创建并分配实际 1 let johnsHouse = Residence() 2 johnsHouse.rooms.append(Room(name: "Living Room")) 3 johnsHouse.rooms.append(Room(name: "Kitchen")) 4 john.residence = johnsHouse 5 6 if let firstRoomName = john.residence?[0].name { 7 print("The first room name is (firstRoomName).") 8 } else { 9 print("Unable to retrieve the first room name.") 10 } 11 // Prints "The first room name is Living Room." 访问可选类型的下标如果下标返回一个可选类型的值 - 例如Swift? 1 var testScores = ["Dave": [86,82,84],"Bev": [79,94,81]] 2 testScores["Dave"]?[0] = 91 3 testScores["Bev"]?[0] += 1 4 testScores["Brian"]?[0] = 72 5 // the "Dave" array is now [91,82,84] and the "Bev" array is now [80,94,81] 上面的示例定义了一个名为的字典 链接多级链接您可以将多个级别的可选链接链接在一起,以深入查看模型中更深层次的属性,方法和下标。但是,多级可选链接不会为返回值添加更多级别的可选性。 换一种方式:
因此:
下面的示例尝试访问 1 if let johnsStreet = john.residence?.address?.street { 2 print("John‘s street name is (johnsStreet).") 3 } else { 4 print("Unable to retrieve the address.") 5 } 6 // Prints "Unable to retrieve the address." 当前值 请注意,在上面的示例中,您尝试检索 如果将实际 1 let johnsAddress = Address() 2 johnsAddress.buildingName = "The Larches" 3 johnsAddress.street = "Laurel Street" 4 john.residence?.address = johnsAddress 5 6 if let johnsStreet = john.residence?.address?.street { 7 print("John‘s street name is (johnsStreet).") 8 } else { 9 print("Unable to retrieve the address.") 10 } 11 // Prints "John‘s street name is Laurel Street." 在此示例中,尝试设置 使用可选返回值链接方法前面的示例演示如何通过可选链接检索可选类型的属性的值。您还可以使用可选链接来调用返回可选类型值的方法,并在需要时链接该方法的返回值。 下面的示例通过可选链接调用 1 if let buildingIdentifier = john.residence?.address?.buildingIdentifier() { 2 print("John‘s building identifier is (buildingIdentifier).") 3 } 4 // Prints "John‘s building identifier is The Larches." 如果你想在这个方法的返回值进行进一步的可选链接,将链接可选问号后,该方法的括号: 1 if let beginsWithThe = 2 john.residence?.address?.buildingIdentifier()?.hasPrefix("The") { 3 if beginsWithThe { 4 print("John‘s building identifier begins with "The".") 5 } else { 6 print("John‘s building identifier does not begin with "The".") 7 } 8 } 9 // Prints "John‘s building identifier begins with "The"." 注意 在上面的例子中,您将可选链接问号后的括号内,因为你要串联上可选的值是 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |