2017-04-21 4 views
0

Modèle Classe:Comment Déballer un objet de classe modaux dans Swift 3

class CountryModel: NSObject { 

    var name:NSString! 

    var countryId:NSString! 

    init(name: NSString, countryId: NSString) { 
     self.name = name 
     self.countryId = countryId 
    } 

} 

ViewController:

var nameArr = [CountryModel]() // Model Class object 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     var cell = UITableViewCell() 

     cell = tableView.dequeueReusableCell(withIdentifier: "cell")! 

     let arr = nameArr[indexPath.row] // How to do if let here 

     let str:String? = "\(arr.countryId) \(arr.name)" 

     if let sstr = str{ 
      cell.textLabel?.text = sstr 
     } 

     return cell 

    } 

Comment doit-on déballez parce que la sortie est une option, si je tente de déballer nameArr[indexPath.row] renvoie une erreur l'initialisation pour la liaison conditionnelle doit avoir le type facultatif, pas "country modal"

Il fonctionne très bien, je ne suis pas concaténer arr.countryId avec arr.name

+0

utilise 'String' au lieu de' NSString 'dans modelClass et comme CountryModal n'est pas un optionnel .. il vous donne cet avertissement. Pas besoin de cocher optionnel là –

+0

@ EICaptainv2.0 Merci Monsieur, Mais après avoir fait ce que vous avez dit il donne un "résultat ici" optionnel, Plus tôt il y avait deux optionnel ("valeur ici" optionnel) – Rishi

Répondre

1

Cela fonctionne très bien

 var nameArr = [CountryModal]() 
     nameArr.append(CountryModal.init(name: "harshal", countryId: "india")) 
     nameArr.append(CountryModal.init(name: "james", countryId: "australia")) 

     let arr = nameArr[0] 
     let str:String? = "\(arr.countryId!) \(arr.name!)" 
     if let sstr = str{ 
      print(sstr) 
     } 

     let arr2 = nameArr[1] 
     let str2:String? = "\(arr2.countryId!) \(arr2.name!)" 

     if let sstr2 = str2{ 
      print(sstr2) 
     } 
+0

Les données de remerciements dans un tableau proviennent d'un JSON , maintenant arr2.name est toujours un optionnel, il dit ** Afghanistan Facultatif (1) ** – Rishi

+0

D'accord, je recevais un Int de JSON, donc dans l'initialiseur j'ai pris un type Int, puis converti en chaîne, cela a fonctionné , merci – Rishi

+0

C'est un exemple très étrange parce que vous annotez une constante de chaîne optionnelle ('String?') mais assignez une valeur 100% non-optionnelle, donc la liaison optionnelle n'a pas de sens. D'autre part, le code se bloque si 'countryId' ou' name' est 'nil'. – vadian

0

Évitez autant déballant forcé que possible. c'est-à-dire en utilisant '!'. Chaque fois que vous voyez!, Essayez et pensez à cela comme odeur de code. Pour l'analyse json, vous ne savez pas avec certitude si les valeurs de countryId et de name existent ou non. Donc, il est logique de les garder comme options et d'essayer de les déplier plus tard.

class CountryModel { 

var name: String? 
var countryId: String? 

init(name: String?, countryId: String?) { 
    self.name = name 
    self.countryId = countryId 
} 

} 

var nameArr = [CountryModel]() 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") else { 
    fatalError("cell should always be initialised") 
} 

var str: String? 

let arr = nameArr[indexPath.row] // How to do if let here 

if let countryId = arr.countryId, let name = arr.name { 
    str = "\(countryId) \(name)" 
} 

if let unwrappedString = str { 
    cell.textLabel?.text = unwrappedString 
} 

return cell 
} 

Bonus: Vous pouvez simplifier JSON l'analyse syntaxique beaucoup en utilisant la bibliothèque Object Mapper. Cela simplifie beaucoup votre logique d'analyse.

2

Vous pouvez essayer cette bibliothèque https://github.com/T-Pham/NoOptionalInterpolation. Il fait exactement cela import NoOptionalInterpolation

let n: Int? = 1 
let t: String? = nil 
let s: String? = "string1" 
let o: String?? = "string2" 

let i = "\(n) \(t) \(s) \(o)" 
print(i) // 1 string1 string2 

NoOptionalInterpolation se débarrasse de "Optional (...)" et "nil" dans l'interpolation de chaîne de Swift. Cette bibliothèque garantit que le texte que vous définissez n'inclut jamais cette "option (...) supplémentaire ennuyante". Vous pouvez également revenir au comportement par défaut si nécessaire.

Notez également que cela n'affecte pas la fonction d'impression. Par conséquent, print (o) (par opposition à print ("(o)", o comme dans l'exemple ci-dessus) s'imprime toujours Optional (Facultatif ("string2"))

+0

Intéressant, mais veuillez l'expliquer un peu plus, ce que signifie les lignes – Rishi

+0

J'ai mis à jour le post, je pense que cela va vous aider. C'est une bibliothèque assez simple et légère. Si vous regardez la mise en œuvre, vous pouvez facilement comprendre. Il a le protocole Unwrappable et l'extension de Optional qui extraient la valeur optionnelle. –