Swift 3属性标签

爱德华多

我正在尝试搜索有关属性标签(例如golang struct标签)的信息,但我没有发现任何问题,很快我们至少有了其他选择?

Golang结构:

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

在Swift中没有这样的属性标签;有关Swift中可用的声明和类型属性的详细信息,请参阅:

但是,如果我们专注于运行时内省,则可以使用该Mirror结构来打印类型的属性名称,如下所示:

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,则可以通过运行协议来实现自己的自定义Mirror,方法是遵守CustomReflectable协议,以适合您的自省目的。在此自定义实现中,您可以将默认属性名称替换为您自己的字段。例如:

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 */

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章