Swift中是否有一种方法可以获取AnyClass
的实例并使用它来声明该类型的数组?
例如,我正在使用Overcoat和Mantle将JSON响应映射到框架中持久存储在CoreData中的模型。在我执行get请求之前,我在Core Data上下文中手动执行获取请求并接收所有持久模型。然后,我必须使用MTLManagedObjectAdapter
将NSManagedObjects
转换为普通模型并返回,以将获取请求的结果映射到我的模型对象中。
为此,我创建了一个我在基础模型类上定义的函数:
class func mapResults(results: [NSManagedObject], toModelClass modelClass: AnyClass) -> ([AnyObject], [NSError?]) {
var transformed: [AnyObject] = []
var errors: [NSError?] = []
for result in results {
var error: NSError? = nil
var model: AnyObject! = MTLManagedObjectAdapter.modelOfClass(modelClass, fromManagedObject: result, error: &error)
transformed.append(model)
errors.append(error)
}
return (transformed, errors)
}
我希望能够将transformed
声明为var transformed: [modelClass] = []
,但原因显而易见无效。有没有办法将AnyClass
对象转换为类型,或者现在在Swift中是不可能的?
答案 0 :(得分:2)
在这种情况下,您可以使用Generics:
class Mapper {
class func mapResults<T: AnyObject>(results: [NSManagedObject], toModelClass modelClass: T.Type) -> ([T], [NSError?]) {
var transformed: [T] = []
var errors: [NSError?] = []
for result in results {
var error: NSError? = nil
var model: T = MTLManagedObjectAdapter.modelOfClass(modelClass, fromManagedObject: result, error: &error) as T
transformed.append(model)
errors.append(error)
}
return (transformed, errors)
}
}
您可以将此方法称为:
let (transformed, errors) = Mapper.mapResults(results, toModelClass: MyModel.self)
此外,根据MTLManagedObjectAdapter.h
,
// modelClass - The MTLModel subclass to return. This class must conform to
// <MTLManagedObjectSerializing>. This argument must not be nil.
因此,您应将T
限制为MTLModel
并符合MTLManagedObjectSerializing
:
class func mapResults<T: MTLModel where T: MTLManagedObjectSerializing>(results: [NSManagedObject], toModelClass modelClass: T.Type) -> ([T], [NSError?]) {