Swift Generic,在运行时首先知道类型
发布时间:2020-12-14 04:30:52 所属栏目:百科 来源:网络整理
导读:我有一个关于 swift和泛型的问题.我尝试做的是获取具有泛型类型的Object.但我首先在运行时知道类型.但要快速达到目的. 新编辑的块: 也许我可以用班级名字来做?我有一个类名作为字符串.我通过镜子得到它.我可以在字符串中创建具有该类名的通用实例吗? let
我有一个关于
swift和泛型的问题.我尝试做的是获取具有泛型类型的Object.但我首先在运行时知道类型.但要快速达到目的.
新编辑的块: 也许我可以用班级名字来做?我有一个类名作为字符串.我通过镜子得到它.我可以在字符串中创建具有该类名的通用实例吗? let classname: String = "ClassA" let firstA: a<classname> = a<classname>() // ^^^^^^^^^ ^^^^^^^^^ // what to put here??? 新编辑的块结束: 我有两个泛型类型的类: 这是我的类型必须实现的协议: protocol ToImplement { func getTypeForKey(key: String) -> NSObject.Type } 这是我用于第一个Generic Type的类: 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) 现在我的问题是:我可以使用泛型类型创建一个类a的实例作为函数的返回值吗?这甚至可能吗? 如果那是不可能的,我怎么能用其他实例创建一个泛型类型的实例.就像是: let someA: a<instance.type> = a<instance.type>() 谢谢您的帮助! 问候 阿图尔 解决方法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() } 这给出了基本相同的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |