Objective c 如何使用AnyClass对象中定义的类型在Swift中声明变量?
在我的旧Obj-C代码中,我可以声明一个字典,它的值是其他类的类类型Objective c 如何使用AnyClass对象中定义的类型在Swift中声明变量?,objective-c,swift,type-conversion,jsonmodel,Objective C,Swift,Type Conversion,Jsonmodel,在我的旧Obj-C代码中,我可以声明一个字典,它的值是其他类的类类型 NSMutableDictionary *Methods = [[NSMutableDictionary alloc] init]; [Methods setObject:[AuthReturnValue class] forKey:@"Authenticate"]; [Methods setObject:[MyOptions class] forKey:@"GetOptions"]; 稍后,基于这个键,我可以将该类分配给另
NSMutableDictionary *Methods = [[NSMutableDictionary alloc] init];
[Methods setObject:[AuthReturnValue class] forKey:@"Authenticate"];
[Methods setObject:[MyOptions class] forKey:@"GetOptions"];
稍后,基于这个键,我可以将该类分配给另一个变量
在标题中
Class returnType;
在实施过程中:
returnType = (Class)[Methods objectForKey:methodName];
然后我可以使用这个类变量来声明一个相同类型的新变量,在本例中,它使用JSONModel,并使用其他地方的NSDictionary初始化它
id<NSObject> result;
result = [[returnType alloc] initWithDictionary:(NSDictionary *)responseObject error:NULL];
还有几十种变种
如何在Swift中将变量声明为AnyClass对象中定义的类?还是我完全搞错了?据我所知,您不能实例化任何类。你必须把它降到一个更具体的类型。此外,要用其元类型实例化的类型必须具有必需的初始化器。如果我理解了您的示例,AuthReturnValue和myOption都是JSONModel的子类,它具有initresponseObject:error:initialiser。然后,每个子类都必须需要并实现该初始化器
class JSONModel {
required init(responseObject: NSDictionary, error: NSError?) {
}
}
class AuthReturnValue : JSONModel {
required init(responseObject: NSDictionary, error: NSError?) {
super.init(responseObject: responseObject, error: error)
}
}
class MyOptions : JSONModel {
required init(responseObject: NSDictionary, error: NSError?) {
super.init(responseObject: responseObject, error: error)
}
}
现在您可以执行以下操作:
var methods = [String : JSONModel.Type]()
methods["Authenticate"] = AuthReturnValue.self
methods["GetOptions"] = MyOptions.self
if let returnType = methods["Authenticate"] {
let result = returnType(responseObject: NSDictionary(), error: nil)
}
更新:
上面的代码在本机Swift类中运行良好,但如果与Objective-C类的子类一起使用,则当前会导致Xcode6-Beta6崩溃。解决方法是在使用之前将元类型值存储在[String:Any.Type]字典中并向下转换。下面的示例演示如何使用NSOperation的子类执行此操作
据我所知,你不能实例化任何类。你必须把它降到一个更具体的类型。此外,要用其元类型实例化的类型必须具有必需的初始化器。如果我理解了您的示例,AuthReturnValue和myOption都是JSONModel的子类,它具有initresponseObject:error:initialiser。然后,每个子类都必须需要并实现该初始化器
class JSONModel {
required init(responseObject: NSDictionary, error: NSError?) {
}
}
class AuthReturnValue : JSONModel {
required init(responseObject: NSDictionary, error: NSError?) {
super.init(responseObject: responseObject, error: error)
}
}
class MyOptions : JSONModel {
required init(responseObject: NSDictionary, error: NSError?) {
super.init(responseObject: responseObject, error: error)
}
}
现在您可以执行以下操作:
var methods = [String : JSONModel.Type]()
methods["Authenticate"] = AuthReturnValue.self
methods["GetOptions"] = MyOptions.self
if let returnType = methods["Authenticate"] {
let result = returnType(responseObject: NSDictionary(), error: nil)
}
更新:
上面的代码在本机Swift类中运行良好,但如果与Objective-C类的子类一起使用,则当前会导致Xcode6-Beta6崩溃。解决方法是在使用之前将元类型值存储在[String:Any.Type]字典中并向下转换。下面的示例演示如何使用NSOperation的子类执行此操作
我在一个小型依赖项注入框架中实现了类似的功能,最后我发现实现这一功能的最佳方法是存储一个实例化对象的闭包 以下是我将如何实现实例化器类:
typealias Constructor = (responseObject: NSDictionary, error: NSError?) -> AnyObject
class Instantiator {
private var instantiators = [String : Constructor]()
func bindKey<T : AnyObject>(key: String, withType type:T.Type, toInitializer initializer: Constructor) {
self.instantiators[key] = initializer
}
func instanceForKey(key: String, responseObject: NSDictionary, error: NSError?) -> AnyObject? {
if let instantiator = self.instantiators[key] {
return instantiator(responseObject: responseObject, error: error)
}
return .None
}
}
我在一个小型依赖项注入框架中实现了类似的功能,最后我发现实现这一功能的最佳方法是存储一个实例化对象的闭包 以下是我将如何实现实例化器类:
typealias Constructor = (responseObject: NSDictionary, error: NSError?) -> AnyObject
class Instantiator {
private var instantiators = [String : Constructor]()
func bindKey<T : AnyObject>(key: String, withType type:T.Type, toInitializer initializer: Constructor) {
self.instantiators[key] = initializer
}
func instanceForKey(key: String, responseObject: NSDictionary, error: NSError?) -> AnyObject? {
if let instantiator = self.instantiators[key] {
return instantiator(responseObject: responseObject, error: error)
}
return .None
}
}
这看起来可能是在正确的方向上,但我在let结果线上得到了EXC_BAD_ACCESS EXC_I386_GPFLT。即使我尝试使用不带参数的returnType构造函数。仍在研究,但还没有运气。在Beta6对我有效。您是否使用了完全相同的代码?如果方法字典不是[String:JSONModel.Type],我也会获得EXC\u BAD\u访问权限。它不能与NSDictionary、[NSObject:AnyObject]、[NSObject:AnyClass]、[String:AnyObject]和[String:AnyClass]一起使用。如果我在JSONodel对象中尝试完全相同的代码,我会收到一个错误,抱怨缺少UsingEncode参数,它认为我在尝试调用不同的super.init重载。如果我只是实现所有必需的init,包括接受[NSObject:AnyObject]的init!NSErrorPointer参数我仍然得到错误基本上我认为,如果在Xcode6b6中,确切的代码适用于您,而不是适用于我,那么我一定是在我发布的代码之外做错了什么。我将继续讨论并让您知道。在我的问题中,可能不清楚的是,我所指的JSON模型是开源JSON框架www.JSONModel.com。因此,尽管您在上面提供的确切代码在我定义一个名为JSONModel的类的游乐场中工作,但实际JSONModel的使用正在消亡,这可能是因为它与Swift不兼容,或者我需要做一些特殊的事情才能让它工作,但我还没有弄清楚是什么。这看起来可能是正确的方向,但我在let结果线上得到了EXC_BAD_ACCESS EXC_I386_GPFLT。即使我尝试使用不带参数的returnType构造函数。仍在研究,但还没有运气。在Beta6对我有效。您是否使用了完全相同的代码?如果方法字典不是[String:JSONModel.Type],我也会获得EXC\u BAD\u访问权限。它不适用于NSDictionary、[NSObject:AnyObject]、[NSObject:AnyClass]、[String:AnyObject]和[String:AnyClass]。如果我在JSONodel对象中尝试完全相同的代码,我会收到一个错误,抱怨缺少UsingEncode参数
它认为我在尝试调用另一个super.init重载。如果我只是实现所有必需的init,包括接受[NSObject:AnyObject]的init!NSErrorPointer参数我仍然得到错误基本上我认为,如果在Xcode6b6中,确切的代码适用于您,而不是适用于我,那么我一定是在我发布的代码之外做错了什么。我将继续讨论并让您知道。在我的问题中,可能不清楚的是,我所指的JSON模型是开源JSON框架www.JSONModel.com。因此,尽管上面提供的代码在我定义一个名为JSONModel的类的游戏中起作用,但实际JSONModel的使用正在消亡,可能是因为与Swift不兼容,或者我需要做一些特殊的事情才能让它工作,但我还没有弄清楚是什么。