Classe modèle:

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 déballer ceci parce que la sortie est facultative, si j'essaye de dérouler nameArr[indexPath.row] donne une erreur l'initialiseur pour la liaison conditionnelle doit avoir un type facultatif, pas "country modal"

Cela fonctionne bien, je ne concatène pas arr.countryId avec arr.name

0
Rishi 21 avril 2017 à 08:29

3 réponses

Meilleure réponse

Cela fonctionne 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)
        }
2
harshal jadhav 21 avril 2017 à 06:01

Évitez autant que possible le déballage forcé. c'est-à-dire en utilisant '!'. Chaque fois que vous voyez!, Essayez de le considérer comme une odeur de code.

Pour l'analyse json, vous ne sauriez pas avec certitude si les valeurs de countryId et name existent ou non. Il est donc logique de les conserver en option et d'essayer de les déballer 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
}

Prime: Vous pouvez beaucoup simplifier votre analyse json en utilisant la bibliothèque Object Mapper. Cela simplifie une grande partie de votre logique d'analyse.

0
jarora 21 avril 2017 à 06:14

Vous pouvez essayer cette bibliothèque https://github.com/T-Pham/NoOptionalInterpolation. Il fait exactement ça 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 supprime "Facultatif (...)" et "nil" dans l'interpolation de chaîne de Swift. Cette bibliothèque garantit que le texte que vous définissez n'inclut jamais cet ennuyeux "facultatif (...)" supplémentaire. Vous pouvez également revenir au comportement par défaut si nécessaire.

Veuillez également noter 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) imprimerait toujours Facultatif (facultatif ("string2"))

2
Indra Mohan 21 avril 2017 à 06:35