2016-07-27 8 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 
     } 

Но этот «тип класса» недоступен в 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 (данные: 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 
}