Ответ 1
Сообщение об ошибке сообщает вам, в чем проблема. Значения словаря вводятся как AnyObject. Я знаю, что вы знаете, что это значение является строковым массивом, но Swift этого не знает; он знает только то, что вы ему сказали, что это AnyObject. Но AnyObject не может быть проиндексирован (на самом деле, вы не можете с ним вообще ничего не делать). Если вы хотите использовать subscriptip, вам нужно сказать Swift, что это не AnyObject, а скорее какой-то массив (здесь массив String).
Тогда возникает вторая проблема, которая заключается в том, что dict["participants"]
на самом деле даже не AnyObject - это необязательная упаковка AnyObject. Таким образом, вам придется развернуть его и бросить, чтобы подстроить его.
Тогда возникает третья проблема, которая заключается в том, что вы не можете мутировать значение массива внутри словаря. Вам нужно будет извлечь значение, изменить его, а затем заменить.
Итак, весь ваш код будет выглядеть так:
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
var arr = dict["participants"] as [String] // unwrap the optional and cast
arr[0] = "baz" // now we can subscript!
dict["participants"] = arr // but now we have to write back into the dict
Дополнительно для экспертов: если вы хотите быть отвратительно здоровым и Swifty (а кто нет?), вы можете выполнить мутацию и назначение за один ход, используя анонимную функцию определения и вызова, например
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
dict["participants"] = {
var arr = dict["participants"] as [String]
arr[0] = "baz"
return arr
}()