簡體   English   中英

Swift 3屬性標簽

[英]Swift 3 attributes tag

我正在嘗試搜索有關屬性標簽(例如golang struct標簽)的信息,但我沒有發現任何問題,很快我們至少有了另一種選擇?

Golang結構:

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

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運行時自省,則可以通過遵循適合自省目的的CustomReflectable協議 ,為您的類型實現自己的自定義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
    }
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM