如何在 Swift 3 中展开模态 class 对象

How to Unwrap a Modal class object in Swift 3

型号Class:

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

    }

如果我尝试解包 nameArr[indexPath.row] 会出现错误 条件绑定的初始化程序必须具有可选类型,不是 "country modal"

它工作正常我没有将 arr.countryId 与 arr.name

连接起来

这很好

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

尽可能避免强制展开。即使用“!”。每当你看到 ! 时,试着把它想象成代码味道。

对于 json 解析,您无法确定 countryId 和 name 的值是否存在。因此,将它们保留为可选项并在稍后尝试优雅地解包它们是有意义的。

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
}

奖金: 您可以使用 Object Mapper 库简化您的 json 解析。它简化了很多解析逻辑。

你可以试试这个库 https://github.com/T-Pham/NoOptionalInterpolation。它正是这样做的 导入 NoOptionalInterpolation</p> <pre><code>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 去掉了 Swift 的字符串插值中的 "Optional(...)" 和 "nil"。该库确保您设置的文本永远不会包含烦人的额外 "Optional(...)"。您还可以在需要时恢复为默认行为。

另请注意,这不会影响打印功能。因此,print(o)(与上例中的 print("(o)"), o 相反)仍会打印出 Optional(Optional("string2"))