Неоднозначная ссылка на членский индекс после преобразования кода из 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)... типы коллекций.

Тем не менее для такой модели вложенных данных настоятельно рекомендуется использовать собственную структуру или класс.

Другие вопросы по тегам