如何传递符合协议的 class 类型

How to pass a class type, that conforms to protocol

我正在尝试使用 SwitfyJson 制作一个通用的消毒器功能。 目前我得到服务器响应的每个地方,我正在解析是这样的:

       let json = JSON(data : networkResponse.data!)
        let usersJson = json["data"]
        var users = [User]()

        for (_,subJson):(String, JSON) in usersJson {
            let user = User(json: subJson)
            users.append(user)
        }

现在我每次都收到回复。 我正在尝试使用通用函数。它应该看起来像这样:

    protocol Serializable {
        init(json: JSON)
    }

       func serializeToArray(data: NSData, serializable:  Serializable)->serializable {

            let json = JSON(data : data)
            let jsonObjects = json["data"]
            var serializedObjects = [serializable.classType]()

            for (_,subJson):(String, JSON) in jsonObjects {
                let serializedObject = User(json: subJson)
                serializedObjects.append(user)
            }

              return serializedObjects
        }

但是这个 "classType" 在 Swift 中不可用。 有什么办法可以实现吗?

也许这就是您要找的:

static func serializeToArray(json:[String:AnyObject]) {
    var serializedObjects = [Serializable]()
    guard let jsonArray = json["data"] as? Array<[String:AnyObject]> else {
        return [Serializable]()
    }

    for jsonDict in jsonArray {
        serializedObjects.append(Serializable(init:jsonDict)) 
   }

    return serializedObjects
}

您可以让您的序列化方法使用通用类型。 看起来你只需要数组的类型。

func serializeToArray<SerializableType : Serializable>(data: NSData, serializableType:  SerializableType.Type)-> [SerializableType] {
    // stuff
    var serializedObjects = [SerializableType]()
    // more stuff
    return serializedObjects
}

这样,您可以将类型传递给函数,而无需先实例化对象:

let users = serializeToArray(data: data, serializableType: User.self)

返回的结果将是 [User]

类型