2016-06-01 3 views
1

Я использую struct в swift.перебрать атрибуты структуры в Swift

class Constants { 
    struct const { 
     static let signupFirstName = "signupFirstName" 
    } 
} 

Я хочу перебрать структуру. Для переборе я использую:

let mirrored_object = Mirror(reflecting: Constants.const()) 
for (index, attr) in mirrored_object.children.enumerate() { 
     if let property_name = attr.label as String! { 
      print("Attr \(index): \(property_name) = \(attr.value)") 
     } 
} 

Но это не входит в код из static значения. Есть ли способ итерации этого struct?

ответ

0

Вы можете сделать это непосредственно путем доступа к переменной на уровне класса

if let property_value = const.signupFirstName as String! { 
    print("hello \(property_value)") 
} 

Убедитесь, что для доступа к нему из класса это сам const не экземпляр const(). Поскольку переменная является статическим, вы не можете получить доступ к нему из instance, вы должны напрямую использовать class

0

Поскольку статические члены являются технически частью типа, а не, например, вам нужно будет подойти к нему таким образом, чтобы отразить на самого типа:

let mirrored_object = Mirror(reflecting: Constants.const.self) 

Однако автоматическое отражение Свифта для типов сами не появляются должны быть реализованы в это время, так что даже выше строка не будет работать.

Это оставляет последний вариант, который определяет ваше собственное зеркало для отображения на экземпляре вашего типа. Это может выглядеть примерно так:

class Constants { 
    struct const : CustomReflectable { 
     static let signupFirstName = "signupFirstName" 
     func customMirror() -> Mirror { 
      return Mirror(self, children: ["signupFirstName" : const.signupFirstName]) 
     } 
    } 
} 

Если вы измените код с CustomReflectable реализацией, аналогична описанному выше, ваш циклом для перебора элементов структуры теперь будет работать.

Быстрое отражение в конечном итоге станет лучше из коробки, возможно, вам захочется попробовать другой подход до тех пор.

+0

Благодарим вас за ответ. Предположим, что у меня есть множественное число статических переменных в Struct: static let signupLastName = "signupLastName", static let signupEmail = "signupEmail" и т. Д. Теперь вместо "return Mirror (self, children: [" signupFirstName ": const.signupFirstName]) ", Я хочу динамически зацикливать эту структуру. Как я могу сделать? Пожалуйста помоги. – Rupshikha

+0

@ user3897036 К сожалению, нет возможности динамически прокручивать что-либо, чтобы создать собственное зеркало. Инициализатор для MirrorType принимает только словарь _literal_, что в конечном итоге означает, что вы должны передать точные значения, которые хотите отразить, и нет возможности для циклирования или генерации на основе переменных и т. Д.: (Опять же, Swift будет улучшаться вниз по дороге, но сейчас это крайне ограничено и не очень полезно. Возможно, вы захотите попробовать другой подход к тому, что вы планируете выполнить. –

+0

Спасибо .. Ваше решение работает как шарм .... :) – Rupshikha

Смежные вопросы