2016-06-01 3 views
1

구조체를 신속하게 사용하고 있습니다.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) 

그러나, 자신이 시간에 구현 될 나타나지 않습니다 유형에 대한 스위프트의 자동 반사, 그래서 심지어 위의 라인이 작동하지 않습니다.

마지막 옵션을 남겨 두었습니다.이 옵션은 유형 인스턴스에 반영하기 위해 사용자 정의 미러를 정의합니다. 위의 유사한 CustomReflectable 구현, 이제 작동합니다 구조체 멤버를 반복하는 루프와 코드를 수정하면

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

: 즉,이 같은 것을 볼 수 있었다.

스위프트 리플렉션이 궁극적으로 더 나을 것입니다. 그때까지는 다른 접근 방법을 시도해 보는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 구조체에 Static 변수가 여러 개 있다고 가정합니다. static let signupLastName = "signupLastName", static let signupEmail = "signupEmail"등. 대신 "return mirror (self, children : ["signupFirstName ": const.signupFirstName]) ",이 구조체를 동적으로 루프 싶습니다. 어떻게해야합니까? 도와주세요. – Rupshikha

+0

@ user3897036 아쉽게도 사용자 정의 미러를 만들기 위해 무엇이든 동적으로 루프 할 수있는 방법이 없습니다. MirrorType의 이니셜 라이저는 _literal_ 사전 만 허용하므로, 반영하려는 정확한 값을 전달해야하며 변수 등을 기반으로 루핑하거나 생성 할 가능성이 없습니다. (다시, 스위프트 반사는 더 좋아질 것입니다 하지만 지금은 극히 제한적이며 그다지 유용하지는 않습니다. 당신이 성취하고자하는 것에 대해 다른 접근법을 시도하고 싶을 수도 있습니다. –

+0

고맙습니다 .. 당신의 솔루션은 매력처럼 작동합니다. :) – Rupshikha

관련 문제