Как возможно динамическое приведение к типу, указанному в строке, с помощью Swift 2.0?

Мне нужно привести возвращаемое значение к определенному типу, который мне нужно сохранить динамическим, например

let cellType = "CellTypeToBeResolved"
cell = (tableView.dequeueReusableCellWithIdentifier("myID") as? CellTypeToBeResolved)!

Как это возможно в Swift 2.0? Спасибо!


person headkit    schedule 04.12.2015    source источник
comment
Вы не можете, и тот факт, что вы думаете, что вам нужно, является Плохим Запахом. Конечно, вы можете поручить Cocoa/Objective-C сделать это за вас, но чистое решение Swift невозможно, поскольку такой динамизм/самоанализ полностью противоречит природе и духу Swift.   -  person matt    schedule 04.12.2015
comment
благодарю вас. может быть ты прав. может быть, я просто хочу сократить слишком много кода.   -  person headkit    schedule 04.12.2015
comment
У меня так много разных tableviewcells - очень плохо...   -  person headkit    schedule 04.12.2015
comment
Моя мысль здесь такова: отступите на пару шагов назад и опишите основную проблему, а давайте поговорим о том, как решить эту проблему. Например, у вас в таблице есть несколько типов ячеек? Я бы сказал удалить этот q. и опишите это. Я думаю, вы обнаружите, что мы можем придумать что-то хорошее с оператором switch или чем-то подобным.   -  person matt    schedule 04.12.2015
comment
Конечно, если вы действительно хотите, чтобы я это сделал, я могу ответить на ваш вопрос небольшой лекцией о том, почему Swift мешает вам делать то, что вы описали, но вряд ли это стоит того. :)   -  person matt    schedule 04.12.2015
comment
Извините, я все равно прочитал вам лекцию. Не стесняйтесь удалять вопрос, я не обижусь. :)   -  person matt    schedule 04.12.2015
comment
Для меня это не проблема. Я люблю задавать глупые вопросы. :-)   -  person headkit    schedule 06.12.2015


Ответы (2)


Вы не можете этого сделать, потому что в Swift (намеренно) отсутствует не одна, а две части головоломки:

  • Вы не можете превратить строку в класс.

  • Что еще более важно, вы не можете привести к классу, выраженному как переменная. Класс для приведения должен быть буквальным классом, то есть он должен быть известен во время компиляции. Компилятору необходимо знать, что это приведение допустимо, а также во время компиляции ему необходимо знать, как обрабатывать эту переменную. Если вы хотите иметь возможность отправлять сообщения экземпляра MyCoolTableCell в эту ячейку, вам нужно использовать буквальное имя MyCoolTableCell в своем коде — не строку, не переменную, содержащую тип, а сам тип.

person matt    schedule 04.12.2015
comment
отлично, спасибо. Я оставляю эти вопросы для других недавних скриптеров, которые раньше использовали языки, где такое небрежное программирование было возможно. - person headkit; 04.12.2015
comment
Не могли бы вы сделать это (при условии, что классы наследуются от NSObject), используя вызовы времени выполнения Cocoa? (Не спорю, что надо, но разве нельзя?) - person Duncan C; 04.12.2015
comment
@DuncanC Не в Swift, нелегко. Вам нужно написать эту часть кода на языке Objective-C. Конечно, вы можете делать вызовы Cocoa, чтобы превратить строку в класс, но вы не можете сделать с ней ничего большего, чем вы могли бы сделать, например. MyCoolTableCell.self в переменной — вы по-прежнему не можете привести к ней в Swift. - person matt; 04.12.2015

Вы можете использовать NSClassFromString для преобразования вашей строки в нужный класс, а затем вы можете использовать это для приведения tableviewCell

person Miguel Angel Jimenez Huerta    schedule 16.12.2018
comment
Это не работает. Использование возвращаемого типа класса после as приводит к ошибке прекомпилятора. - person Alex Zavatone; 02.02.2019