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

时间:2016-07-27 14:22:02

标签: ios swift swifty-json

我正在尝试使用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中不可用。 有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

也许这更像是你正在寻找的东西:

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
}

答案 1 :(得分:0)

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

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]

类型