Swift 我找到了一种将类转换为字典的通用方法,有没有一种通用方法可以逆转这个过程?

Swift 我找到了一种将类转换为字典的通用方法,有没有一种通用方法可以逆转这个过程?,swift,generics,dictionary,reflection,Swift,Generics,Dictionary,Reflection,所以我正在尝试用Swift构建一个数据映射器风格的ORM。我试图找到一种方法将任何实体转换为字典,以便将其映射到数据库表。我使用以下代码成功地做到了这一点: public protocol Entity: class { var id: Int? { get set } } func unwrap(any:Any) -> Any? { let mi = Mirror(reflecting: any) if mi.displayStyle != .Optional

所以我正在尝试用Swift构建一个数据映射器风格的ORM。我试图找到一种方法将任何实体转换为字典,以便将其映射到数据库表。我使用以下代码成功地做到了这一点:

public protocol Entity: class {
    var id: Int? { get set }
}

func unwrap(any:Any) -> Any? {
    let mi = Mirror(reflecting: any)

    if mi.displayStyle != .Optional {
        return any
    }

    if mi.children.count == 0 {
        return nil
    }

    let (_, some) = mi.children.first!

    return some
}

public func serialize<T: Entity>(entity: T) -> [String:String] {
    let aMirror = Mirror(reflecting: entity)
    var dict = [String:String]()

    for child in aMirror.children {
        if let label = child.label where !label.hasPrefix("_") {
            switch unwrap(child.value) {
            case let entity as Entity:
                if let id = entity.id {
                    dict[label] = String(id)
                }
            case let .Some(test):
                dict[label] = String(test)
            default: break
            }
        }
    }

    return dict
}

public class User: Entity {
    public var id: Int?
    var username: String
    var password: String
    var role: UserRole?

    public init(username: String, password: String) {
        self.username = username
        self.password = password
    }

    public func assignRole(role: UserRole) {
        self.role = role
    }
}

public class UserRole: Entity {
    public var id: Int?
    var name: String
    var description: String

    public init(name: String, description: String) {
        self.name = name
        self.description = description
    }
}
将打印:
[“密码”:“某种密码”,“角色”:“1”,“用户名”:“NotMyRealName”]

这很好,但现在我想扭转这个过程

我想写一个函数,可以这样使用:

let user = unserialize(["username":"Me", "password":"secret"]) as? User

你认为这可能吗?我知道如果我试图绕过init方法可能会有点麻烦,但我想试试。

可能有几种方法可以实现这一点。您想用字典做什么?我将使用字典在实体对象和SQLite数据库表之间来回切换。(当然不必是SQLite,但例如yes)。所以我已经知道如何从Entity到字典,但现在我想知道如何从字典到实体……你考虑CordADATA吗?是的,我在考虑,我还在考虑。事实上,我还不太了解CoreData,但从我从一些教程中收集到的信息来看,您似乎有义务使用NSManagedObject的(一个子类),我更愿意为每个实体使用一个完全干净的类。这有意义吗?我鼓励您尝试一下CoreData。是的,您必须使用NSManagedObject或其子类,是的,需要掌握学习曲线。但这是一个合理的努力,它会很快得到回报。
let user = unserialize(["username":"Me", "password":"secret"]) as? User