2017-04-21 50 views
0

模型类:如何解开一个模式类对象斯威夫特3

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]给出了一个错误条件绑定的初始化必须具有可选类型,而不是“国家模式”

它正常工作,我不跟arr.name

+0

使用'String'而不是'NSString '在modelClass中,因为CountryModal不是可选的..它会给你提示。没有必要在那里检查可选 –

+0

@ EICaptainv2.0谢谢先生,但做完你所说的它给了一个可选的“结果在这里”,早些时候有两个可选的(可选的“值在这里”) – Rishi

回答

1

串联arr.countryId这工作得很好

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

谢谢数组中的数据是从JSON ,现在arr2.name仍然是一个可选的,它说**阿富汗可选(1)** – Rishi

+0

好了,我从JSON获得一个Int,所以在初始化程序中我采用了Int类型,然后转换为字符串,它工作,谢谢 – Rishi

+0

这是一个非常奇怪的例子,因为你注释了一个可选的字符串常量('String?'),但分配了一个100%的非可选值,所以可选的绑定是没有意义的。另一方面,如果'countryId'或'name'为'nil',则代码崩溃。 – vadian

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 
} 

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

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”。该库确保您设置的文本永远不会包含令人讨厌的附加“可选(...)”。您也可以在需要时恢复默认行为。

此外,请注意,这不会影响打印功能。因此,打印(o)(而不是打印(“(o)”),o仍然会打印出可选项(可选(“string2”))

+0

有趣的,但请好好解释一下,有什么线意味着 – Rishi

+0

我已更新帖子,我认为这会帮助你。这是非常简单和轻量级的库。如果你看看你可以很容易理解的实现。它具有Unwrappable协议和可选的扩展,提取可选值。 –