0

型号类:

class CountryModel: NSObject {

    var name:NSString!

    var countryId:NSString!

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

}

视图控制器:

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]的错误初始化程序必须具有可选类型,而不是“国家模式”

它工作正常我没有将 arr.countryId 与 arr.name 连接起来

4

3 回答 3

2

这工作正常

        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)
        }
于 2017-04-21T06:01:42.377 回答
2

你可以试试这个库https://github.com/T-Pham/NoOptionalInterpolation。它正是这样做的 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 摆脱了 Swift 字符串插值中的“Optional(...)”和“nil”。该库确保您设置的文本永远不会包含烦人的附加“可选(...)”。您还可以在需要时恢复到默认行为。

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

于 2017-04-21T06:23:45.790 回答
0

尽量避免强制拆包。即使用'!'。每当您看到 ! 时,请尝试将其视为代码异味。

对于 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 解析。它简化了很多解析逻辑。

于 2017-04-21T06:14:50.343 回答