-1

我是快速编程的新手。将此代码从 swift 2 更新到 swift 3 后,我遇到了这个问题

Swift 2 代码是

let dicConversation = self.conversationListArray?[indexPath.row] as! NSMutableDictionary 

现在我通过将其拆分为部分成功地在 swift 3 中转换了此代码

斯威夫特 3 代码

let accountArrayDict = self.conversationListArray?[indexPath.row] as? Dictionary<String, Any>
let accountArray : [String : String] = accountArrayDict?["accounts"] as! [String : String]

代码在 swift 3 中成功转换,但我不知道如何转换下面的这一行:

cell.conversationTitle?.text = accountArray?[0]["displayName"] as? String
        

下面是我尝试过的,但在第一部分显示错误。第二个现在好了

cell.conversationTitle?.text = accountArray[0] as![String]
let accountArray : [String] = accountArrayDict?["displayName"] as! [String]
4

1 回答 1

0

首先,永远不要将(非可选)表视图的数据源数组声明为可选。

var conversationListArray = [[String:Any]]()

这避免了很多问号和类型转换,
编译器知道accountArrayDict[String:Any]

let accountArrayDict = self.conversationListArray[indexPath.row]

该名称accountArray暗示该类型是一个数组,因此它是

let accountArray = accountArrayDict["accounts"] as! [[String : String]]

然后你可以写

cell.conversationTitle?.text = accountArray[0]["displayName"]

由于编译器知道内部字典具有String值,因此您也可以摆脱这种类型转换。这是一个很好的例子,为什么 Swift 原生类型比 FoundationNS(Mutable)...集合类型更高效。

尽管如此,对于像这样的嵌套数据模型,强烈建议使用自定义结构或类。

于 2017-09-26T10:06:15.050 回答