2015-01-08 2 views
4

Картинка стоит тысячи слов, как переписать этот код с Objective-C на Swift?Создать экземпляр класса, известного во время выполнения в Swift

- (id) instanceOfClass: (Class) class withInitializer: (SEL) initializerSelector withObject: (id) object { 
    id obj = nil; 
    if([class instancesRespondToSelector:initializerSelector]) { 
     obj = [[class alloc] performSelector:initializerSelector 
            withObject:object]; 
    } 
    return obj; 
} 

id myViewController = [self instanceOfClass:[ViewController class] 
           withInitializer:@selector(initWithObject:) 
            withObject:@"super-string!"]; 
NSLog(@"%@", myViewController); 
+0

Сложность заключается не в динамическом классе, а в динамическом селекторе. В Swift можно создавать экземпляры с динамическим классом с фиксированным инициализатором. Тем не менее, в Swift вообще невозможно использовать методы вызова (или инициализаторы в этом случае) с динамическим селектором, поскольку он принципиально небезопасен (селектор не несет информацию типа вызываемого метода). – newacct

ответ

1

Это не может быть сделано исключительно в Swift. Вы можете сделать это, создав «экземпляр класса по имени» в Objective C и вызвав этот код из Swift.

Для получения дополнительной информации вы можете прочитать эту статью. http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

И проверить это GitHub репо https://github.com/ijoshsmith/swift-factory

0

Если вы можете сделать ваши классы подклассы общего суперкласса вы можете сделать это:

class C { 
    var typ:String 
    init() { 
    self.typ = "C" 
    } 
    class func newInst() -> C { 
    return C() 
    } 
} 

class C1 : C { 
    override init() { 
    super.init() 
    self.typ = "C1" 
    } 
    override class func newInst() -> C1 { 
    return C1() 
    } 
} 

class C2 : C { 
    override init() { 
    super.init() 
    self.typ = "C2" 
    } 
    override class func newInst() -> C2 { 
    return C2() 
    } 
} 

var CL:C.Type = C1.self 
CL = C2.self 
var inst = CL.newInst() 

inst.typ 

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

0

См. Отличный ответ мата here. В основном с помощью @objc вы можете имитировать динамическое создание экземпляров.

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