2016-07-27 47 views
0

我正在尝试使用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) 
     } 

现在,这是上每隔是我得到的响应。 我试图使用一个通用函数insted。它看起来应该是这样的:

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

回答

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]

+0

感谢,伟大的答案!我已经将通用名称更改为'T'以提高可读性“static func serializeToArray (data:NSData,_:T.Type) - > [T]” – MCMatan

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 
} 
相关问题