Подтвердить что ты не робот

(String: AnyObject) не имеет члена с именем 'subscript'

Я сталкивался с подобными вопросами, но до сих пор не понимаю, почему мой код выдает ошибку.

var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
dict["participants"][0] = "baz"

Ошибка указана в строке 3: (String: AnyObject) does not have a member named 'subscript'

Я устанавливаю ключ participants в массив, а затем пытаюсь обновить первый его элемент без везения. Вышеприведенный код сокращен для примера, но я использую [String:AnyObject], потому что в словаре хранятся не только массивы.

Возможно, что-то действительно тривиально, но я все еще новичок в Swift. Спасибо за любую помощь заранее!

4b9b3361

Ответ 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
}()