프로토콜을 준수하는 유형을 취하고이 클래스의 인스턴스를 인스턴스화하는 메소드를 작성하고 있습니다. 빌드 할 때 컴파일러가 segfault와 충돌합니다. 이 점은 99 %의 컴파일러 버그를 지적하고 싶지만, 내가하려고하는 것이 논리적으로 정확한지 또는 컴파일러에서 절대 난센스를 던지는 것에 관심이 있으며 놀라지 말아야한다. 그것을 참조하십시오. 여기 프로토콜 유형에서 클래스 인스턴스화
내가 또한 문제의 근본 인 등의 방법 매개 변수로 입력을 전달 배제하려protocol CreatableClass {
init()
}
class ExampleClass : CreatableClass {
required init() {
}
}
class ClassCreator {
class func createClass(classType: CreatableClass.Type) -> CreatableClass {
return classType()
}
}
ClassCreator.createClass(ExampleClass.self)
내 코드는 다음과 같은 코드는 컴파일러 충돌 :
protocol CreatableClass {
init()
}
class ExampleClass : CreatableClass {
required init() {
}
}
let classType: CreatableClass.Type = CreatableClass.self
let instance = classType()
을
그래서 - 이것은 단순한 컴파일러 버그이며 내가하려고하는 것이 합리적인 것처럼 보이는지, 아니면 내 구현에 잘못된 것이 있습니까?
편집 :
이 아래와 같이 @Antonio으로 제네릭을 사용하여 달성 할 수 있지만, 불행하게도 난 내 응용 프로그램에 유용하지 않습니다 믿을 .
이 작업을 수행하는 실제 비 무식하게 아래로 사용 케이스 내가 일반적으로 할
protocol CreatableClass {}
protocol AnotherProtocol: class {}
class ClassCreator {
let dictionary: [String : CreatableClass]
func addHandlerForType(type: AnotherProtocol.Type, handler: CreatableClass.Type) {
let className: String = aMethodThatGetsClassNameAsAString(type)
dictionary[className] = handler()
}
required init() {}
}
을하는 방법을 사용 매우 유사한 문제에 대한 자세한 논의는 http://stackoverflow.com/a/27574558/97337을 참조하십시오. 이 경우의 대답은 필요한 것을 구성 할 수있는 클로저를 전달하는 것이 었습니다. 즉, 특정 경우에 처리기가 클래스의 형식이 아니라 단지'CreatableClass' 인 경우 작동 할 것입니다. 그래서 저는 이것보다 더 많은 질문이 있다고 가정합니다. –