2014-10-10 2 views
5

Swift에서 사전의 조회 값을 기준으로 유형을 어떻게 동적으로 인스턴스화합니까?사전에서 스위프트 개체 만들기

+1

로 업데이트 불행하게도 당신은 지금 모든 인식의 부족 문제를 수정했습니다. 더 이상 질문이 무엇인지 또는 이것이 해결책인지 명확하지 않습니다. 원래 질문을 덮어 쓰는 질문을 편집하는 것이 아니라 원래 질문으로 되돌아 가서 답을 답으로하는 것이 좋습니다. – matt

+0

그래, 정말로 더 이상 질문하지 않습니다. 나는 이제 그 질문에 대답했다. 아니면 내가 돌아 가야 하나? – possen

+1

Swift에서는 본질적으로 그렇게 할 수 없습니다. 그러나 Objective-C에서이를 수행 할 수 있으며 Swift는 Objective-C 객체와 완벽하게 상호 작용할 수 있습니다. NSObject의 하위 클래스는 신속한 객체가 아니라 Objective-C 객체입니다. 그들은 거의 동일하게 행동하지만 Objective-C는 동적 일 수 있지만 다른 단점이 있습니다 (예 : 훨씬 느립니다). –

답변

4

다른 사람들에게 유용하게 사용되기를 바랍니다. 이것을 알아 내기 위해 연구가 필요했습니다. 목표는 거대한 if 또는 switch 명령문의 안티 패턴을 피하여 값에서 각 오브젝트 유형을 작성하는 것입니다.

class NamedItem : CustomStringConvertible { 
    let name : String 

    required init() { 
     self.name = "Base" 
    } 

    init(name : String) { 
     self.name = name 
    } 

    var description : String { // implement Printable 
     return name 
    } 
} 

class File : NamedItem { 
    required init() { 
     super.init(name: "File") 
    } 
} 

class Folder : NamedItem { 
    required init() { 
     super.init(name: "Folder") 
    } 
} 

// using self to instantiate. 
let y = Folder.self 
"\(y.init())" 

let z = File.self 
"\(z.init())" 

// now put it in a dictionary. 
enum NamedItemType { 
    case Folder 
    case File 
} 

var typeMap : [NamedItemType : NamedItem.Type] = [.Folder : Folder.self, 
                .File : File.self] 
let p = typeMap[.Folder] 
"\(p!.init())" 
let q = typeMap[.File] 
"\(q!.init())" 

흥미로운 측면 : 초기화를위한 "필수"의

  • 사용 .Type의
  • 사용은 사전 값의 유형을 얻을.
  • 인스턴스를 생성 할 수있는 "클래스"를 얻으려면 .self를 사용합니다. 동적 객체를 인스턴스화하는 데()를 사용합니다.
  • 암시 적 문자열 값을 얻기 위해 인쇄 가능한 프로토콜을 사용합니다.
  • 매개 변수화되지 않은 초기화를 사용하여 초기화하고 하위 클래스 초기화에서 값을 가져 오는 방법

스위프트 3.0 구문

+2

나는이 계몽을 발견했다. 연구 공유에 감사드립니다. – vacawama

+0

제안에 감사드립니다. – possen