如何在 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"))
型号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"))