[英]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.