2016-07-06 1 views
-1

Swift 2.0에서 유형 정보를 분석하려고하는데 정적 구조에 저장하려고합니다.하지만 멈 춥니 다. 가장 유망한 접근법은 인스턴스에 대한 미러를 만드는 것입니다.이 미러는 기본 init을 가정하고 필요에 따라 한 번 수행되며 미러 요소의 subjectType을 봅니다.Swift 2.0 유형 분석을위한 리플렉션

내 질문은 :

  • 방법 선택 유형 (예를 들어 Optional<String>를) 풀다 수 있습니다. 유형으로 String 부분을 갖고 싶습니다.
  • 일반 배열 유형을 결정하는 방법 (예 : Array<Foo>.

.. 문자열이 바보이고 아마 불가능 배열에 관한

다른 질문을 구문 분석 : A는 요소 유형이있는 경우, 내가 어떻게 새 인스턴스를 만들 수 있습니까?

더 명확하게 말하십시오. 타입 매퍼 (Object mappers, json mappers, widget mappers 등)와 같은 상위 레벨 알고리즘의 유형 정보가 필요합니다. 관련 객체의 유형에 대한 정보가 필요합니다. 유형이 안전하거나 필요한 경우 적절한 변환을 삽입해야합니다.

예외를 발생시키지 않아야하는 Int? 속성에 매핑해야하는 속성 인 Int을 생각해보십시오.

코드는 지금까지 필요한 모든 정보를 저장해야합니다 PropertyDescriptor 년대의 배열을 포함하는 BeanDescriptor 클래스를 채우고

뭔가 같은 :

class PropertyDescriptor { 
    // instance data 

    var bean: BeanDescriptor; 
    var name: String; 
    var type: Any.Type; 
    var optional = false 
    // more data for arrays, e.g. elementType... 
    ... 
} 

코드는 지금까지 클래스를 분석하는 것입니다 :

// create a default instance 
let instance = create(); // we need a NSObject though! darn... 
let mirror = Mirror(reflecting: instance) 
if let displayStyle = mirror.displayStyle { 
    if displayStyle == .Class { 
    for case let (label?, value) in mirror.children { 
     let property = analyzeProperty(label, value: value) 

     properties[property.name] = property; 
     } // for 
    } 
} 

및 호출 된 함수

func analyzeProperty(name : String, value: Any) -> PropertyDescriptor { 
    let mirror : Mirror = Mirror(reflecting: value) 
    var type = mirror.subjectType 
    var optional = false 

    // no way..this sucks! 

    if (type == String?.self) { 
     type = String.self // uhhhh 
     optional = true 
    } 
    else if ... // lots other literal types, ... 

    return PropertyDescriptor(bean: self, name: name, type: type, optional: optional) 
} 

그러나 이것은 다른 선택적 클래스 Money?뿐만 아니라 배열에 관한 다른 정보를 포함하지 않습니다. 내가 어레이 형 검출 것이며 예컨대 일반 배열 유형을 결정하는 방법 요소 유형

+1

을 당신이 원하는 것을 이해하는 데 어려움을 겪습니다. 코드를 게시 할 수 있다고 생각하십니까? 당신이 가지고있는 것을 보여주는 것, 당신이 원하는 것, 그리고 당신이 생각하고있는 것을 보여주는 의사 코드. – solidcell

+0

님이 질문을 편집했습니다 :-) –

답변

-1

를 결정해야 Array<Money> 또는 Array<Money?> "배열 < 푸">

this SO question을 살펴보십시오. 빈 배열은 Array<AnyObject>으로 발견되므로 현재 비어 있지 않은 배열에서만 가능하다는 것을 알 수 있습니다.

요소 유형이있는 경우 새 인스턴스를 어떻게 만듭니 까?

다음 예제에서는 객체를 유형별로 초기화하는 방법을 보여줍니다. 이것은 (빈) init() 생성자가있는 한 모든 유형에 대해 수행 할 수 있습니다.

let myType = ...//your code for getting the type 
let object: MyObject = myType.init() 
+0

왜 downvote ?! 명확히하십시오. –

0

질문을 올바르게 이해하면 수업을 분석하고 각 속성의 유형을 찾고 싶습니까? 나는 똑같은 필요를 가지고 있었고 마침내 그 일을하게되었습니다.

NSObject에서 상속받은 모든 클래스가 제공되는 속성의 이름과 유형을 찾는 해결책이 있습니다.

나는 StackOverflow here에 긴 설명을 작성하고, 내 프로젝트, 당신은 같은 것을 할 (그러나 실제로 코드 Github에서 체크 아웃) 할 수 요컨대

here on Github로 볼 수 있습니다 : 난

public class func getTypesOfProperties(inClass clazz: NSObject.Type) -> Dictionary<String, Any>? { 
    var count = UInt32() 
    guard let properties = class_copyPropertyList(clazz, &count) else { return nil } 
    var types: Dictionary<String, Any> = [:] 
    for i in 0..<Int(count) { 
     guard let property: objc_property_t = properties[i], let name = getNameOf(property: property) else { continue } 
     let type = getTypeOf(property: property) 
     types[name] = type 
    } 
    free(properties) 
    return types 
} 
+0

답장을 보내 주셔서 감사합니다. 나는 처음에는 그것을 시도했지만 선택도에 도움이되지 않았기 때문에 작동하지 않았다. 또한 다른 데이터 유형 (수치 스터프)으로 몇 가지 이상한 결과를 보여 주었기 때문에 작동하지 않았다. 결국 나는 프로토 타입 객체를 생성하고 미러를 사용하는 해결책을 가지고 머물렀다. 함께 배열 확장 옵션과 함께 나는 (구현 된 프로토콜 제외) 흥미로운 것들을 대부분 확인할 수 있습니다. 결과는 다음에서 볼 수 있습니다. https://github.com/coolsamson7/inject/blob/master/Inject/beans/BeanDescriptor.swift –

+0

작동하지 않는 기능은 무엇입니까? :) – Sajjon

+0

질문 답하기 :-) –