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

Ios 如何在Swift 3中展开模态类对象,ios,swift3,optional,unwrap,forced-unwrapping,Ios,Swift3,Optional,Unwrap,Forced Unwrapping,模型类: class CountryModel: NSObject { var name:NSString! var countryId:NSString! init(name: NSString, countryId: NSString) { self.name = name self.countryId = countryId } } 视图控制器: var nameArr = [CountryModel]() // M

模型类:

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连接起来这工作正常

        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)
        }
这个很好用

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

尽可能避免强制展开。i、 e.使用“!”。每当你看到!,试着把它想象成代码气味

对于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
}
奖金:
使用该库可以大大简化json解析。它简化了很多解析逻辑

尽可能避免强制展开。i、 e.使用“!”。每当你看到!,试着把它想象成代码气味

对于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
}
奖金: 使用该库可以大大简化json解析。它简化了很多解析逻辑

你可以试试这个库。正是这样

进口NooptionInterpolation

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的字符串插值中去掉了“可选(…)”和“nil”。此库确保您设置的文本永远不会包含令人讨厌的附加“可选(…)”。您还可以在需要时恢复到默认行为

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

您可以尝试这个库。正是这样

进口NooptionInterpolation

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的字符串插值中去掉了“可选(…)”和“nil”。此库确保您设置的文本永远不会包含令人讨厌的附加“可选(…)”。您还可以在需要时恢复到默认行为


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

在modelClass中使用
String
而不是
NSString
,因为CountryModal不是可选的。。它给了你这个警告。不需要检查可选项there@EICaptainv2.0谢谢,先生,但是在完成您所说的操作后,它会给出一个可选的“结果”,前面有两个可选的(可选的“值”),在modelClass中使用
String
而不是
NSString
,因为CountryModal不是可选的。。它给了你这个警告。不需要检查可选项there@EICaptainv2.0谢谢,先生,但是在做了您所说的之后,它给出了一个可选的“结果”,之前有两个可选的(可选的“值”),谢谢数组中的数据来自JSON,现在arr2.name仍然是可选的,它说阿富汗可选(1)好的,完成了,我从JSON得到了一个Int,在初始化器中,我使用了一个Int类型,然后转换成string,它起作用了,谢谢这是一个非常奇怪的例子,因为你注释了一个可选的字符串常量(
string?
),但是指定了一个100%的非可选值,所以可选绑定是没有意义的。另一方面,如果
countryId
name
nil
,代码就会崩溃。感谢数组中的数据来自JSON,现在arr2.name仍然是可选的,它说是可选的(1)好了,我从JSON中得到了一个Int,所以在初始值设定项中,我得到了一个Int类型,然后转换成字符串,它工作了,感谢这是一个非常奇怪的例子,因为您注释了可选的字符串常量(
string?
),但指定了100%的非可选值,因此可选绑定没有意义。另一方面,如果
countryId
name
nil
,代码就会崩溃。有趣的是,请再解释一下,这些行意味着什么我已经更新了帖子,我想这会对你有所帮助。这是一个非常简单和轻量级的库。如果您看一下实现,就会很容易理解。它有不可破解的协议和可选的扩展来提取可选值。很有趣,但是请再解释一下,这些行是什么意思?我已经更新了帖子,我想这会对你有所帮助。这是一个非常简单和轻量级的库。如果您看一下实现,就会很容易理解。它有不可破解的协议和可选的扩展来提取可选值。