2016-08-13 3 views
-2

Мой вопрос, если у вас есть Array объектов, которые соответствуют . Я хочу перебрать массив, вызывающий метод для каждого члена массива. Однако метод, который я хочу назвать, является статическим и использует генерики. Мне нужно получить класс элемента в массиве, чтобы сделать это. как вы получаете класс этого объекта? Является ли это возможным?Получить класс или структуру, которые соответствуют протоколу для использования в функции с использованием Generics

Я пишу библиотеку общих функций в Свифт.

У меня есть протокол, называемый DBAble, который имеет в качестве функции:

static func get<T: DBable >(id:Int) -> T? 

У меня есть массив объектов, которые согласуются с DBAble:

let objs:[DBAble] = [] 

Я хочу перебрать массив и называют:

for obj in objs { 
    obj.get(id: anInt) 
} 

однако я получаю это сообщение:

Статический член «GET» не может быть использован в экземпляре типа «DBable.Protocol»

Есть ли способ найти класс (или тип структуры) объекта, которая соответствует протокол? Я понимаю, что я могу сделать:

if obj is User { 

} 

однако это не решение, которое я ищу.

+0

Ваше изменение не уточняет, что вы ожидаете 'get (_ :)' для возврата при вызове в цикле for. Вы ожидаете 'T == obj.dynamicType'? – Hamish

ответ

0

Проблема с подходом к прикладным, что тип Т сильфона методом

static func get<T: DBable >(id:Int) -> T? 

должен быть известен во время компиляции, в то время как dynamicType даст вам тип во время выполнения.

Для кого-либо еще, рассматривающего этот вопрос, ответ не является возможным, чтобы найти тип для использования в общей функции во время выполнения. Как поясняется в комментариях от @hamish

"element.dynamicType is the actual type of a given element in your array. Your get(_:) method has a generic parameter T that must be known at compile time" 

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

  • Нет связанных вопросов^_^