将代码从 swift 2 转换为 xcode 8 中的 swift 3 后,对成员下标的引用不明确

ambiguous reference to member subscript after conversion of code from swift 2 to swift 3 in xcode 8

我是 swift 编程新手。将此代码从 swift 2 更新为 swift 3

后,我遇到了这个问题

Swift 2 个代码是

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

现在我在 swift 3 中成功转换了这段代码,将其拆分为多个部分

Swift3码

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]

首先,从不 将(非可选)table 视图的数据源数组声明为可选。

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 本机类型比 Foundation NS(Mutable)... 集合类型更有效。

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