Я пытаюсь создать экземпляр класса из строки, но он не работает из-за обобщений.
У меня есть объявление этого класса:
class PollSummaryView<T: PollSummary>: UIView {}
А затем много подклассов:
class TextPollSummaryView: PollSummaryView<TextPollSummary> {}
class ChartingPollSummaryView: PollSummaryView<ChartPollSummary> {}
Затем я пытаюсь создать экземпляр этого:
let contentClassName = "\(summary.poll.type.rawValue)PollSummaryView"
let contentClass = classFromString(contentClassName) as? PollSummaryView.Type
Но это ноль.Также пробовал это с теми же результатами:
let contentClassName = "\(summary.poll.type.rawValue)PollSummaryView"
let contentClass = classFromString(contentClassName) as? PollSummaryView<PollSummary>.Type
На всякий случай, это фрагмент classFromString:
func classFromString(_ className: String) -> AnyClass? {
let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String;
let cls: AnyClass? = NSClassFromString("\(namespace).\(className)");
return cls;
}
В Java Android я делаю это:
public static @Nullable
<T extends PollSummaryView> T createView(PollSummary summary, Context context) {
try {
String simpleClassName = StringUtils.capitalize(summary.getPoll().getType().name()).concat("PollSummaryView");
String className = String.format("%s.%s", getPackage(), simpleClassName);
Class<? extends PollSummaryView> clazz = Class.forName(className).asSubclass(PollSummaryView.class);
return (T) clazz.getConstructor(summary.getClass(), Context.class).newInstance(summary, context);
} catch (Exception e) {
return null;
}
}
И это работает, но предупреждает о неконтролируемом приведении.
Есть ли там какой-нибудь эксперт по Swift?
Большое спасибо!