我正在尝试使用泛型动态创建一个基于class
实例的类型,但是我在类自省方面遇到了困难。
以下是问题:
是否有一个与Obj-C的self.class
NSClassFromString
AnyClass
结果实例化一个类?有没有办法严格地从泛型参数AnyClass
中获取T
或其他类型信息?(类似于C#的typeof(T)
语法)发布于 2014-06-05 09:26:26
首先,[NSString class]
的Swift等价物是.self
(参见Metatype docs,尽管它们都很薄)。
事实上,NSString.class
甚至不能工作!您必须使用NSString.self
。
let s = NSString.self
var str = s()
str = "asdf"
类似地,我尝试了一个快速类...
class MyClass {
}
let MyClassRef = MyClass.self
// ERROR :(
let my_obj = MyClassRef()
嗯,…错误信息为:
游乐场执行失败: error::16:1: error::error:构造具有元类型值的类类型'X‘的对象需要'@required’初始值设定项
Y().me() ^ :3:7:注意:选择了类型为'()‘的隐式初始值设定项X{^
我花了一段时间才弄明白这是什么意思,…结果是它想让这个类有一个@required init()
class X {
func me() {
println("asdf")
}
required init () {
}
}
let Y = X.self
// prints "asdf"
Y().me()
一些文档将其称为.Type
,但MyClass.Type
在游乐场上给了我一个错误。
发布于 2014-06-13 10:05:06
下面是如何使用NSClassFromString
。你必须知道你最终会得到什么超类。下面是一个超类-子类对,它们知道如何为println
描述自身
@objc(Zilk) class Zilk : NSObject {
override var description : String {return "I am a Zilk"}
}
@objc(Zork) class Zork : Zilk {
override var description : String {return "I am a Zork"}
}
注意使用特殊的@obj
语法来指定这些类的Objective-C参数名称;这是至关重要的,因为否则我们不知道指定每个类的参数字符串。
现在,我们可以使用NSClassFromString
来创建Zork类或Zilk类,因为我们知道可以将其作为NSObject类型,而不会在以后崩溃:
let aClass = NSClassFromString("Zork") as NSObject.Type
let anObject = aClass()
println(anObject) // "I am a Zork"
而且它是可逆的;println(NSStringFromClass(anObject.dynamicType))
也可以工作。
现代版本:
if let aClass = NSClassFromString("Zork") as? NSObject.Type {
let anObject = aClass.init()
print(anObject) // "I am a Zork"
print(NSStringFromClass(type(of:anObject))) // Zork
}
发布于 2014-06-10 08:47:43
如果我没看错文档,如果你处理实例,例如,想要返回一个与给定对象相同类型的新实例,并且该类型可以用init()构造,你可以这样做:
let typeOfObject = aGivenObject.dynamicType
var freshInstance = typeOfObject()
我用String快速测试了一下:
let someType = "Fooo".dynamicType
let emptyString = someType()
let threeString = someType("Three")
它工作得很好。
https://stackoverflow.com/questions/24049673
复制相似问题