2017-06-23 3 views
0

Zum einen bekommen wird werden eine Basisklasse namens Basemodel, ist unter dem Code:wie Elementtyp für Array in schnellen

class BaseModel : NSObject 
{ 
    var code:Int?   
    var message:Any? 

    public func setDictionaryToAttributes(dictionary_is dictionary:Dictionary<String,Any>?)->Bool 
    { 
     guard let dic:Dictionary<String,Any> = dictionary else {return false} 

     for (key,value) in dic { 
      let someType = type(of: value) 
      debugPrint("\(String(describing: someType.self))") 
      debugPrint("\(String(describing: someType))") 
      if someType is Array<Any>.Type { //i can't get TestListItemModel string    
       debugPrint("\(String(describing: someType))") 
      } 
     } 

     self.setValuesForKeys(dic) 
     return true; 
    } 
}//class BaseModel end 

und es gibt eine weitere Klasse von Basemodel geerbt

class TestListModel: BaseModel { 
    var tatalink:Any? 
    var items:Array<TestListItemModel>? 

    func setValuesFrom(jsonData j:JSON) { //j is a swifyJson object 

     guard var dic = j.dictionaryObject else {return} 
     if self.setDictionaryToAttributes(dictionary_is: dic)==false { 
      return 
     } 
    } 
} 

gibt es eine Klasse TestListItemModel für submodel in TestListModel

Frage ist: Ich möchte alle Attributwerte in der BaseModel-Klasse von JSON-Daten automatisch analysieren. in func analysetDictionaryToAttributes: Ich kann herausfinden, welches Array ist, aber ich weiß nicht, wie man diesen Typ bekommt und weiterhin seine analysetDictionaryToAttributes func nennen.

+0

deklarieren Sie Ihre Strings als Any-Objekt. – KKRocks

+0

OK, ich werde es für jedes Objekt tun, aber ich kann immer noch nicht xxxType im Array xuanwenchao

+0

@KKRocks Vielen Dank für Ihre Antwort aufrichtig, ich bin auf der Suche nach einer langen Zeit im Netz. Aber keine Verwendung. Bitte helfen oder versuchen Sie, einige Ideen zu geben, wie dies zu erreichen ist. – xuanwenchao

Antwort

0

Warum erwarten Sie TestListItemModel in Ihrer BaseModel Klassenfunktion. Zuallererst kann ich keine Struktur sehen, die TestListItemModel hat. Da kann ich sehen Sie nur auf json Wörterbuch Objekt, das von der Klasse nicht bewusst ist ‚TestListItemModel‘ in dieser Linie

self.setDictionaryToAttributes(dictionary_is: dic) 

Warum erwarten Sie, dass übergeordnete Klasse über seine Kind-Klasse hier wissen ist TestListItemModel und TestListModel.

So in dieser Funktion

public func setDictionaryToAttributes(dictionary_is dictionary:Dictionary<String,Any>?)->Bool

erhalten Sie immer Wörterbuch des String als Schlüssel und Wert als jede Art. Und wenn Sie String erwarten, können Sie es immer auf diese Weise überprüfen.

if value = value as String 
{ 
    print(value) 
} 
+0

danke für Ihre Antwort, es gibt mehrere ein Paar KEY und VALUE im Wörterbuch, wie folgt :("code": "1") ("message": "xxx") ("tatalink": "xxx") ("items": "[xxx, xxx, xxx]") und ich hoffe, dass nur eine Funktion alle Attribute in BaseModel analysieren kann – xuanwenchao

+0

Aber baseModel wird das nie wissen, wenn es weitere childModels gibt .. Und wenn du es in childModels parsen willst .. Sie können es in generischer Weise parse ie [String: Any] .. –

+0

JA, Mein Problem ist, dass immer sagen, Typ ist Array in BaseModel, aber ich habe immer gedacht, dass wir es in Laufzeit wissen, Link dynamisches Bindeprinzip. – xuanwenchao