Неоднозначная ссылка на членский индекс после преобразования кода из swift 2 в swift 3 в xcode 8
Я новичок в быстром программировании. Я столкнулся с этой проблемой после обновления кода с swift 2 на swift 3
Код Swift 2 был
let dicConversation = self.conversationListArray?[indexPath.row] as! NSMutableDictionary
Теперь я успешно преобразовал этот код в Swift 3, разделив его на части
Код Swift 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]
1 ответ
Прежде всего, никогда не объявляйте массивы источников данных для (необязательных) табличных представлений как необязательные.
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)...
типы коллекций.
Тем не менее для такой модели вложенных данных настоятельно рекомендуется использовать собственную структуру или класс.