スウィフト任意の連鎖
任意の連鎖(オプションチェーン)は、プロセスアプローチとサブスクリプトがターゲット要求の呼び出しかnilであってもよいし、要求する方法であり、プロパティを呼び出すです。
任意の連鎖は、2つの値を返します。
目標に値がある場合、呼び出しは、戻り値を成功します
ターゲットがnilの場合、呼び出しはnilを返します。
いずれかのノードが障害がチェーン全体の原因となりますnilの場合複数の要求または呼び出しは、チェーンにリンクすることができます。
任意の連鎖代替強制決意
プロパティ、メソッド、またはオプションの値のインデックススクリプトは疑問符を入れて(?)を追加することによって、あなたは、任意の連鎖を定義することができます。
オプションのチェーン '?' | 感嘆符(!)、拡張メソッド、プロパティ、添字スクリプト任意の連鎖を強制するには |
?後で呼び出すメソッド、プロパティ、添字スクリプト上に配置され、オプションの値 | 必須値を拡大する!オプションの後に呼び出し元のメソッドに配置された値、特性、添字スクリプト |
オプションの出力は、よりわかりやすいエラーメッセージはnilである場合 | nilにオプションの拡張は、実行エラーを強制する場合 |
感嘆符(!)を使用し、オプションのチェーンの例
class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 } let john = Person() //将导致运行时错误 let roomCount = john.residence!.numberOfRooms
上記プログラム実行出力は、次のとおりです。
fatal error: unexpectedly found nil while unwrapping an Optional valueその後は値が解決居住のために使用することはできませんがあるので、この人の住居プロパティnumberOfRoomsプロパティ値の解析を強制するには感嘆符(!)を使用したい、それは、ランタイムエラーがスローされます。
感嘆符(!)を使用し、オプションのチェーンの例
class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 } let john = Person() // 链接可选residence?属性,如果residence存在则取回numberOfRooms的值 if let roomCount = john.residence?.numberOfRooms { print("John 的房间号为 \(roomCount)。") } else { print("不能查看房间号") }
上記プログラム実行出力は、次のとおりです。
不能查看房间号
これらの試みnumberOfRooms操作が失敗することがありますので、任意の連鎖は、Type値のInt?返す、または「任意のInt」と呼ばれます。 居住地は時(例)空だったとき、INTは空になりますので、アクセスnumberOfRoomsの場合がありません]を選択します。
なお、でも非オプションnumberOfRoomsのInt(INT?)これも真実です。 限り、要求が最終numberOfRoomsによる任意の連鎖いつものIntを返す?代わりのIntであるとして。
モデルクラスは、任意の連鎖として定義されています
あなたは、マルチコールのプロパティ、メソッド、およびインデックススクリプトに任意の連鎖を使用することができます。 これにより、より根本的な特性を得るためにそれらの間の複雑なモデルを使用し、あなたがそのような根本的な特性を得ることができるかどうかをチェックすることができます。
例
モデルは、マルチ任意の連鎖を含む4つのクラスを定義しています。
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 } } // 模型中的最终类叫做Address class 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 } } }
任意の連鎖メソッド呼び出しで
オプションのチェーンを使用して、メソッドの呼び出しが成功した確認することができ、代替設定を呼び出すための方法。 このメソッドは値を返さない場合でも、この目的を達成するための任意の連鎖を使用することができます。
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 } } // 模型中的最终类叫做Address class 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() if ((john.residence?.printNumberOfRooms()) != nil) { print("输出房间号") } else { print("无法输出房间号") }
上記プログラム実行出力は、次のとおりです。
无法输出房间号
ステートメントが成功したコールprintNumberOfRooms方法かどうかをチェックする場合に使用します:メソッド呼び出しは、任意の連鎖を通じて成功すると成功しない、それがnilを返した場合、printNumberOfRooms暗黙の戻り値は、無効となります。
任意の連鎖コール添字スクリプトを使用
ただし、オプションの連鎖指数スクリプトを設定することはできません、標準のスクリプトから値を取得し、次の呼び出し添字スクリプトが正常に行われた検討しようとする任意の連鎖を使用することができます。
例1
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 } } // 模型中的最终类叫做Address class 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() if let firstRoomName = john.residence?[0].name { print("第一个房间名 \(firstRoomName).") } else { print("无法检索到房间") }
上記プログラム実行出力は、次のとおりです。
无法检索到房间
circname.print任意の連鎖は、オプションの値を取得しようとしたので、次の標準スクリプトがcircname.print疑問符のすぐ後ろに任意の連鎖を呼び出して、次の標準スクリプトが正面を括弧します。
例2
レジデンスjohn.residenceを作成するためのインスタンスの例としては、彼の部屋部屋の配列の1つ以上のインスタンス、あなたはレジデンス添字スクリプトによって配列インスタンス内の部屋を取得するには、オプションのチェーンを使用することができます。
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 } } // 模型中的最终类叫做Address class 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 = johnsHouse if let firstRoomName = john.residence?[0].name { print("第一个房间名为\(firstRoomName)") } else { print("无法检索到房间") }
上記プログラム実行出力は、次のとおりです。
第一个房间名为客厅
オプションのリンク呼び出しを介してインデックスにアクセスするには
オプションのリンク・コールでは、我々は任意の値に読み取りまたは書き込みがインデックスを使用し、添字呼び出しが成功した決定することができます。
例
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 } } // 模型中的最终类叫做Address class 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 = johnsHouse if let firstRoomName = john.residence?[0].name { print("第一个房间名为\(firstRoomName)") } else { print("无法检索到房间") }
上記プログラム実行出力は、次のとおりです。
第一个房间名为客厅
インデックスのアクセスオプションの種類
インデックスは、キーインデックスの辞書でスウィフトとして、NULL値の型を返すことがあります。 あなたは空の戻り値の下で、被写体へのリンクを置くために疑問符の後の括弧内の次のターゲットを閉じることができます:
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]] testScores["Dave"]?[0] = 91 testScores["Bev"]?[0]++ testScores["Brian"]?[0] = 72 // the "Dave" array is now [91, 82, 84] and the "Bev" array is now [80, 94, 81]
上記の例では、String型のキーは整数配列にマッピングされ、testScoresアレイは2キーと値のペアを含む定義されています。
このサンプルでは、アレイ91、最初の要素1「ベヴ」配列の最初の要素に設定されている任意のリンクに「デーブ」とコールし、その後、72に設定されている「ブライアン」配列の最初の要素にしてみてください。
二つの重要な存在ので、最初の2つの呼び出しが、成功しています。 しかし、辞書内のキー "ブライアン"は存在しないので、第三の呼び出しに失敗しました。
マルチリンク接続
必要に応じてさらなる方法およびインデックススクリプトダウンモデルのプロパティ内のチェーン一緒に複数の層を掘削することができることができます。 しかし、オプションのマルチチェーン比はより多くの層を返した任意の値を追加することができます。
オプションの整数値のチェーンを介して取得しようとすると、関係なく、どのように多くのリンク層のいつものIntを返します?。 同様に、あなたは関係なく、常にintを返しますどのように多くのリンク層の任意の連鎖のInt?値、を介して取得しようとすると?。
例1
次の例では、プロパティの住所ジョンズ滞留プロパティを取得しようとします。 本明細書で使用する場合、2つのオプションのチェーンは、それらの両方は任意のタイプであり、居住地とアドレスの属性を連絡します:
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 } } // 模型中的最终类叫做Address class 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() if let johnsStreet = john.residence?.address?.street { print("John 的地址为 \(johnsStreet).") } else { print("不能检索地址") }
上記プログラム実行出力は、次のとおりです。
不能检索地址
例2
あなたは値john.residence.addressのアドレスに例を設定し、プロパティの実際の住所の値を設定した場合は、チェーンの複数の層は、このオプションの属性値を取得することができます。
class Person { var residence: Residence? } class Residence { var rooms = [Room]() var numberOfRooms: Int { return rooms.count } subscript(i: Int) -> Room { get{ return rooms[i] } set { rooms[i] = newValue } } func printNumberOfRooms() { print("房间号为 \(numberOfRooms)") } var address: Address? } class Room { let name: String init(name: String) { self.name = name } } class 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() john.residence?[0] = Room(name: "浴室") let johnsHouse = Residence() johnsHouse.rooms.append(Room(name: "客厅")) johnsHouse.rooms.append(Room(name: "厨房")) john.residence = johnsHouse if let firstRoomName = john.residence?[0].name { print("第一个房间是\(firstRoomName)") } else { print("无法检索房间") }
上の例の出力は、次のとおりです。
第一个房间是客厅
リターンリンクの値のオプション機能
また、この方法は、任意のリンクでnull値を返し呼び出すことができます、そしてあなたは、代替設定]リンクを継続することができます。
例
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 } } // 模型中的最终类叫做Address class 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() if john.residence?.printNumberOfRooms() != nil { print("指定了房间号)") } else { print("未指定房间号") }
上記プログラム実行出力は、次のとおりです。
未指定房间号