2016-01-08 2 views
4

У меня есть вопрос о быстрых и дженериках. То, что я пытаюсь сделать, это получить объект с общим типом. Но сначала я знаю тип во время выполнения. Но быстро добраться до места.Swift Generic с типом, известным во время выполнения

Новый отредактированный блок:

Может быть, я могу сделать это с именем класса? У меня есть имя класса в виде строки. Я получил его через зеркало. Могу ли я создать общий экземпляр с этим именем класса в строке?

let classname: String = "ClassA" 
let firstA: a<classname> = a<classname>() 
//   ^^^^^^^^^  ^^^^^^^^^ 
//   what to put here???   

Новый конец отредактирован блок:

У меня есть два класса с общими типами:

Это протокол мой тип должен реализовывать:

protocol ToImplement { 
    func getTypeForKey(key: String) -> NSObject.Type 
} 

Это класс I для моего первого типа Тип:

class MyClass: ToImplement { 
    func getTypeForKey(key: String) -> NSObject.Type { 
     if key == "key1" { 
      return UIView.self 
     } 
     else { 
      return UIButton.self 
     } 
    } 
} 

это мой первый класс с универсального типа:

class a<T:ToImplement> { 
    func doSomethingWith(obj: T) -> T { 

     // the next part usually runs in an iteration and there can be 
     // a lot of different types from the getTypeForKey and the number 
     // of types is not known 

     let type = obj.getTypeForKey("key1") 
     let newA: a<type> = a<type>()  // how could I do this? To create a type I do not know at the moment because it is a return value of the Object obj? 
     //   ^^^^  ^^^^ 
     //   what to put here??? 


     return obj 
    } 
} 

и это, как я хотел бы использовать его:

let mycls: MyClass = MyClass() 
let firstA: a<MyClass> = a<MyClass>() 
firstA.doSomethingWith(mycls) 

Теперь мой вопрос: Могу ли я создать экземпляр класса а с типичным типом я получаю как возвращаемое значение функции? Возможно ли это?

Если это невозможно, как я могу создать экземпляр с общим типом из другого экземпляра. Что-то вроде:

let someA: a<instance.type> = a<instance.type>() 

Благодарим за помощь!

С уважением

Артур

ответ

1
let type = obj.getType 

ОК, так type является NSObject.Type. Поскольку NSObject предоставляет init(), вы можете создать экземпляр этого типа с

let obj = type.init() // obj is a NSObject (or subclass) 
return obj 

Конечно, это произойдет сбой во время выполнения, если фактический тип, возвращаемый getType() не реализует init().

Другой вариант заключается в использовании ассоциированный тип:

protocol ToImplement { 
    typealias ObjType: NSObject 
} 

Затем вы можете использовать его в качестве общего ограничения:

func makeAnObject<T: ToImplement>(obj: T) -> T.ObjType { 
    return T.ObjType() 
} 

Это дает в основном тот же самый результат.

+0

Привет, спасибо за ваш ответ, но я думаю, что это не то, что мне нужно. Представьте, что у меня есть классы под названием Car, Bike and House. они реализуют протокол «ToImplement».My MyClass возвращает один из таких типов, как Car, Bike, House или даже сам (MyClass). Теперь я хочу создать новый экземпляр a с таким типом, который был возвращен, но я не знаю его в это время. возможно, что-то вроде 'let newA = a ()'. Я знаю, что это неправильно, но это именно то, что я пытаюсь сделать. –

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