2016-07-27 12 views
0

Ich versuche, mit SwitfyJson eine generische Sterilisatorfunktion zu erstellen. Derzeit jeder, wo ich Server-Antwort bekommen, ich bin Parsen ist wie folgt:Wie man einen Klassentyp übergibt, der dem Protokoll entspricht

 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) 
     } 

Nun ist diese immer wieder jede ist war ich eine Antwort bekommen. Ich versuche eine generische Funktion zu verwenden. Es sollte ungefähr wie folgt aussehen:

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 
     } 

Aber diese „Classtype“ ist in Swift nicht zur Verfügung. Gibt es eine Möglichkeit, das zu erreichen?

Antwort

0

Sie können Ihre serialize-Methode einen generischen Typ verwenden machen. Offenbar brauchen Sie nur den Typ des Arrays.

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

Auf diese Weise können Sie Ihre Art an die Funktion übergeben, ohne dass zunächst ein Objekt instanziiert:

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

Das zurückgegebene Ergebnis wird dann der [User] Typ sein

+0

Danke, Große Antwort ! Ich habe gerade den generischen Namen zur besseren Lesbarkeit in 'T' geändert "static func serializeToArray (Daten: NSData, _: T.Type) -> [T]" – MCMatan

0

Vielleicht ist dies, was Sie suchen:

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 
} 
Verwandte Themen