Есть ли способ перечислить все переменные класса в Swift?Как перечислить все переменные класса в swift
Например:
class foo {
var a:Int? = 1
var b:String? = "John"
}
Я хочу перечислить так: [a:1, b:"John"]
Есть ли способ перечислить все переменные класса в Swift?Как перечислить все переменные класса в swift
Например:
class foo {
var a:Int? = 1
var b:String? = "John"
}
Я хочу перечислить так: [a:1, b:"John"]
Ниже следует использовать отражение для создания списка членов и значений. См скрипку в http://swiftstub.com/836291913/
class foo {
var a:Int? = 1
var b:String? = "John"
}
let obj = foo()
let reflected = reflect(obj)
var members = [String: String]()
for index in 0..<reflected.count {
members[reflected[index].0] = reflected[index].1.summary
}
println(members)
Выход:
[b: John, a: 1]
Этот ответ http://stackoverflow.com/a/24069875/1187415 имеет комментарий со ссылкой на https://gist.github.com/mchambers/67640d9c3e2bcffbb1e2, где (если я правильно ее понимают), извлекаются фактические значения, а не только описания строк. –
Вот что мне нужно, спасибо Джейсону! –
Не знал этого. Благодаря! Ваш 'for' будет более« swifty », если он написан как' для индекса в 0 ..
Как вы можете это сделать в Swift 3.0 рекурсивно:
import Foundation
class FirstClass {
var name = ""
var last_name = ""
var age = 0
var other = "abc"
func listPropertiesWithValues(reflect: Mirror? = nil) {
let mirror = reflect ?? Mirror(reflecting: self)
if mirror.superclassMirror != nil {
self.listPropertiesWithValues(reflect: mirror.superclassMirror)
}
for (index, attr) in mirror.children.enumerated() {
if let property_name = attr.label as String! {
//You can represent the results however you want here!!!
print("\(mirror.description) \(index): \(property_name) = \(attr.value)")
}
}
}
}
class SecondClass: FirstClass {
var yetAnother = "YetAnother"
}
var second = SecondClass()
second.name = "Name"
second.last_name = "Last Name"
second.age = 20
second.listPropertiesWithValues()
результаты:
Mirror for FirstClass 0: name = Name
Mirror for FirstClass 1: last_name = Last Name
Mirror for FirstClass 2: age = 20
Mirror for FirstClass 3: other = abc
Mirror for SecondClass 0: yetAnother = YetAnother
'label' ник каким-то образом из преобразованного класса ObjC (например, FirstClass находится в ObjC). – allenlinli
Это решение ObjC работает вместо https://stackoverflow.com/questions/13922581/is-there-a-way-to-log-all-the-property-values-of-an-objective-c-instance – allenlinli
Может быть, немного поздно для партии, но это решение с помощью отражения и зеркало 100% рабочий:
class YourClass : NSObject {
var title:String
var url:String
...something other...
func properties() -> [[String: Any]] {
let mirror = Mirror(reflecting: self)
var retValue = [[String:Any]]()
for (_, attr) in mirror.children.enumerated() {
if let property_name = attr.label as String! {
retValue.append([property_name:attr.value])
}
}
return retValue
}
}
и где-то в коде ...
var example = MoreRow(json: ["title":"aTitle","url":"anURL"])
print(example.listPropertiesWithValues())
Близка (дубликат?) Вопрос: [Список свойств класса в swift] (http://stackoverflow.com/questions/24844681/list-of-classs-properties-in-swift) –
Нравится: http://stackoverflow.com/questions/24844681/list -of-class-properties-in-swift? Oh - кажется так :-) –
Я действительно пробовал, но это не сработало для меня, в моем случае мне нужно получить переменные, а не свойства. –