2017-09-08 6 views
2

オブジェクトのすべてのプロパティと割り当てられた値をリストする便利なメソッドを書き込もうとしています(toString())。スウィフト3リフレクション - プロパティの反復

class FooModel 
{ 
    func toString() -> String 
    { 
     var result = "[\(String(describing: type(of: self))) " 
     let mirror = Mirror(reflecting: self) 
     mirror.children.forEach 
     { 
      child in 
       result += "\(child.label): \(child.value), " 
     } 
     return "\(result)]" 
    } 
} 

class FooProject : FooModel 
{ 
    var id = 0 
    var name = "" 
    var announcement:String? 
    var showAnnouncement = false 
    var isCompleted = false 
    var completedOn:String? 
    var suiteMode = 0 
    var url = "" 
} 

出力:

[FooProject Optional("id"): 0, Optional("name"): , Optional("announcement"): nil, Optional("showAnnouncement"): false, Optional("isCompleted"): false, Optional("completedOn"): nil, Optional("suiteMode"): 0, Optional("url"): , ] 

まず、それが実際の値が、デフォルト値が表示されません。何故ですか? 次に、Optionalカプセル化を取り除く方法はありますか?ドキュメントによれば

+0

'id'と' name'が 'Optional()'と表示されるのはなぜですか? –

+1

@ニコラスミアリええ、それは私が思っているものです。 – BadmintonCat

+1

child.labelを使用できます!オプションのカプセル化を取り除く – 3stud1ant3

答えて

1

Childhere

子供

反射インスタンスの構造の要素。適切な場合には、オプションのラベルを使用することができます。 格納されているプロパティまたはアクティブな列挙ケースの名前を表し、文字列が子孫メソッドに渡されたときに参照 に使用されます。ミラーにおける型子供が

typealias Child = (label: String?, value: Any) 

として定義されているので

したがってすべての名前はOptionalsとして印刷されています。ある

class FooModel 
{ 
     func toString() -> String 
     { 
       var result = "[\(String(describing: type(of: self))) " 
       let mirror = Mirror(reflecting: self) 
       mirror.children.forEach 
         { 
           child in 
           print(child) 
           if let label = child.label { 

               result += "\(label): \(child.value), " 


           } 

       } 
       return "\(result)]" 
     } 
} 

class FooProject : FooModel 
{ 
     var id = 0 
     var name = "" 
     var announcement:String! 
     var showAnnouncement = false 
     var isCompleted = false 
     var completedOn:String! 
     var suiteMode = 0 
     var url = "" 

     init(id: Int, name: String, completedOn: String) { 
       self.completedOn = completedOn 
       self.id = id 
       self.name = name 
       //... 

     } 
} 

    let fooProj = FooProject(id: 10, name: "Name", completedOn: "Sunday") 
    print(fooProj.toString()) 

Ouptut:

[FooProject id: 10, name: Name, announcement: nil, showAnnouncement: false, isCompleted: false, completedOn: Sunday, suiteMode: 0, url: , ] 

HTH ..

は、あなたが、私はいくつかの変更を行い、運動場でこれを試してみました

結合オプションを使用することができますラベル名を取得するには

+0

ありがとう!しかし、ラベルの後ろに '!'を追加するだけで十分です。 – BadmintonCat