2016-11-18 8 views
0

golang構造タグのような属性タグについて何かを検索しようとしていますが、私は何も見つけ出しませんでした。Swift 3属性タグ

Golang構造体:

struct { 
microsec uint64 "field 1" 
serverIP6 uint64 "field 2" 
process string "field 3" 
} 

答えて

1

スウィフトで容易に入手可能ではそのような属性タグはありません。スウィフトで利用可能な宣言と型の属性に関する詳細については、を参照してください。私たちは、実行時のイントロスペクションに焦点を当てた場合

、しかし、あなたはあなたのタイプのプロパティ名を印刷するMirror structureを使用することができ、次のように:

struct Foo { 
    let microsec: UInt64 //"field 1" 
    let serverIP6: UInt64 // "field 2" 
    let process: String // "field 3" 
    init(_ microsec: UInt64, _ serverIP6: UInt64, _ process: String) { 
     self.microsec = microsec 
     self.serverIP6 = serverIP6 
     self.process = process 
    } 
} 

let foo = Foo(100, 999, "foo") 

Mirror(reflecting: foo).children.forEach { print($0.0 ?? "no field name") } 
/* microsec 
    serverIP6 
    process */ 

あなたが言及属性タグの単一の目的はMirrorを使用して、実行時のイントロスペクションである場合は、独自のカスタムを実装することができる0123お使いのタイプのは、CustomReflectable protocolに準拠しており、イントロスペクションの目的に適しています。このカスタム実装では、デフォルトのプロパティ名を自分のフィールドに置き換えることができます。例:

struct Foo { 
    let microsec: UInt64 //"field 1" 
    let serverIP6: UInt64 // "field 2" 
    let process: String // "field 3" 
    init(_ microsec: UInt64, _ serverIP6: UInt64, _ process: String) { 
     self.microsec = microsec 
     self.serverIP6 = serverIP6 
     self.process = process 
    } 
} 

extension Foo : CustomReflectable { 
    var customMirror: Mirror { 
     return Mirror(self, children: [ 
      "field 1" : "\(microsec)", 
      "field 2" : "\(serverIP6)", 
      "field 3" : process 
     ]) 
    } 
} 

let foo = Foo(100, 999, "foo") 

Mirror(reflecting: foo).children 
    .forEach { print($0.0 ?? "no field name", $0.1) } 
/* field 1 100 
    field 2 999 
    field 3 foo */ 
+0

ありがとうございました、dfri。 – eduardo

+0

@eduardo喜んで助けてください! – dfri

関連する問題