来自AnyClass对象的Swift声明的类型化数组

时间:2015-02-03 17:53:52

标签: ios swift

Swift中是否有一种方法可以获取AnyClass的实例并使用它来声明该类型的数组?

例如,我正在使用OvercoatMantle将JSON响应映射到框架中持久存储在CoreData中的模型。在我执行get请求之前,我在Core Data上下文中手动执行获取请求并接收所有持久模型。然后,我必须使用MTLManagedObjectAdapterNSManagedObjects转换为普通模型并返回,以将获取请求的结果映射到我的模型对象中。

为此,我创建了一个我在基础模型类上定义的函数:

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中是不可能的?

1 个答案:

答案 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?]) {