2016-06-20 13 views
0

Ich habe ein kleines Problem mit PushRow. ich rufe meine Werte über JSON, aber ich kann sie nicht in der PushRow setzen:/SWIFT: Kann keinen Wert vom Typ zuweisen .../SwiftyJSON

Meine Werte:

{ 
"listValue": [{ 
    "id": 1, 
    "value": "Value 1" 
},{ 
    "id": 2, 
    "value": "Value 2" 
},{ 
    "id": 3, 
    "value": "Value 3" 
}] 
} 

1/eine Struktur Deklarieren Sie die ID und den Wert zu halten:

struct MyStruct { 
    var id: Int 
    var value: String 

    init(id: Int, value: String) { 
     self.id = id 
     self.value = value 
    } 
} 

2/Machen sie es gleichzusetzen entsprechen

struct MyStruct { 
    var id: Int 
    var value: String 

    init(id: Int, value: String) { 
     self.id = id 
     self.value = value 
    } 
} 

extension MyStruct: Equatable {} 

func ==(lhs: MyStruct, rhs: MyStruct) -> Bool { 
    let areEqual = lhs.id == rhs.id && 
     lhs.value == rhs.value 

    return areEqual 
} 

3/Make MyStruct entspricht CustomStringConve rtible

struct MyStruct : CustomStringConvertible { 
    var id: Int 
    var value: String 

    init(id: Int, value: String) { 
     self.id = id 
     self.value = value 
    } 

    var description: String { 
     return "\(self.id)"+" "+"\(self.value)" 
    } 

} 

extension MyStruct: Equatable {} 

func ==(lhs: MyStruct, rhs: MyStruct) -> Bool { 
    let areEqual = lhs.id == rhs.id && 
     lhs.value == rhs.value 

    return areEqual 
} 

Und jetzt habe ich ein Problem, die json Listvalue Antwort in ein Array von MyStruct zu konvertieren .. (kann nicht Wert vom Typ zuweisen '[String: JSON]' eingeben '[MyStruct]') Wie geht das?

In meinem Code verwende ich Eureka

<<< PushRow<MyStruct>(idItem) { 
    $0.title = item["libItem"].stringValue 
    $0.options = item["listValue"].dictionaryValue 

My Listvalue ein JSON ist (mit SwiftyJSON)

Haben Sie eine Idee, mir zu helfen?

Antwort

0

Lösung # 1 (mit struct):

struct MyStruct : CustomStringConvertible { 

    var id: Int 
    var value: String 

    init(id: Int, value: String) { 
     self.id = id 
     self.value = value 
    } 

    var description: String { 
     //return "\(self.id)"+" "+"\(self.value)" 
     return "\(self.value)" 
    } 

} 

extension MyStruct: Equatable {} 

func ==(lhs: MyStruct, rhs: MyStruct) -> Bool { 
    let areEqual = lhs.id == rhs.id && 
     lhs.value == rhs.value 
    return areEqual 
} 

Und

var arrayOfMyStruct:[MyStruct] = [] 
for item in item["listValue"].arrayValue { 
    print(item["id"].intValue) 
    print(item["value"].stringValue) 
    print("#############") 
    arrayOfMyStruct.append(MyStruct(id: item["id"].intValue, value: item["value"].stringValue)) 
} 

form.last! // recupère la dernière section 
    <<< PushRow<MyStruct>(idItem) { 
     $0.title = item["libItem"].stringValue 
     $0.options = arrayOfMyStruct 
    } 

es funktioniert!

Lösung # 2 (mit Array):

var Liste : [String] = [] 
for (idvaleur,TabValeur):(String, JSON) in item["listValue"] { 
      print(TabValeur["id"]) 
      print(TabValeur["value"]) 
      print("#######") 
      Liste.append(TabValeur["value"].stringValue) 
} 

print(Liste) 

form.last! // recupère la dernière section 
<<< PushRow<String>(idItem) { 
    $0.title = item["libItem"].stringValue 
    $0.options = Liste 
} 
0

Und jetzt, wenn Sie wollen die ID der Auswahl abzurufen (und nicht das, was angezeigt wird .. also: Wert)

let valeursFormulaire = self.form.values(includeHidden: true) 

for (idvaleur,valeur):(String, Any?) in valeursFormulaire { 
    if let laValeur = valeur { 

     let typeDeChamps = String(laValeur.dynamicType) 

     switch(typeDeChamps){ 

      case "MyStruct": 
       if let rowValue = self.form.rowByTag(idvaleur)?.baseValue as? MyStruct { 
        print("\(rowValue.id)") // id here :) 
       } 

      default: 
       print("\(idvaleur)"+" "+"\(laValeur)") 
     } 
    } 
}