Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使用AnyClass对象中定义的类型在Swift中声明变量?_Objective C_Swift_Type Conversion_Jsonmodel - Fatal编程技术网

Objective c 如何使用AnyClass对象中定义的类型在Swift中声明变量?

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"]; 稍后,基于这个键,我可以将该类分配给另

在我的旧Obj-C代码中,我可以声明一个字典,它的值是其他类的类类型

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不兼容,或者我需要做一些特殊的事情才能让它工作,但我还没有弄清楚是什么。