Я не совсем понимал, как сформулировать вопрос, но, похоже, лучший способ объяснить мой вопрос - дать код:

Следующий код выдает ошибку :

var indexDict = [String: [String]]()
var array = ["At", "Ab", "Bs", "BE", "SD"]

for val in self.array { 
     //get the first letter
     let char = val.removeAtIndex(val.startIndex)
     var str = String(char).capitalizedString
     if let _ = Int(str) {
         str = "#"
     }

     //see if it's in the index array, if it isn't add it
     if (indexDict[str] == nil) {
         indexDict.updateValue([val], forKey: str)
     } else {
         indexDict.updateValue(indexDict[str]!.append("\(val)"), forKey: str)
        }
}

Ошибка: Cannot invoke 'append' with an argument list of type '(String)'

Однако этот код не выдает ошибку:

var indexDict = [String: [String]]()
var array = ["At", "Ab", "Bs", "BE", "SD"]

for val in self.array { 
     //get the first letter
     let char = val.removeAtIndex(val.startIndex)
     var str = String(char).capitalizedString
     if let _ = Int(str) {
         str = "#"
     }

     //see if it's in the index array, if it isn't add it
     if (indexDict[str] == nil) {
         indexDict.updateValue([val], forKey: str)
     } else {
         var arr = indexDict[str]!
         arr.append("\(val)")
         indexDict.updateValue(arr, forKey: str)
        }
}

Я не понимаю, почему установка переменной и обновление Dictionary с помощью этой переменной чем-то отличается от прямого обновления Dictionary со значением, которому присвоена переменная.

Благодарность!

0
uti0mnia 29 Окт 2015 в 19:58

3 ответа

Лучший ответ

Проще говоря, это потому, что в этом выражении:

indexDict[str]!.append

... то, что вы пытаетесь append, не является ссылкой var. Это просто своего рода временное значение, плавающее в середине выражения.

Но в этом выражении:

 var arr = indexDict[str]!
 arr.append("\(val)")

... вы остановились, чтобы предоставить актуальную ссылку на var для этой вещи. И это то, что вы можете сделать append.

1
matt 29 Окт 2015 в 17:04

Результирующий тип выражения

indexDict[str]!.append("\(val)")

Пустота

Вы не можете обновить свой словарь с помощью Void ...

0
user3441734 29 Окт 2015 в 17:33

Настоящий ответ таков:

indexDict[str]!.append("\(val)")

Возвращает Void, а не массив строк, который необходим в updateValue(). Это работает:

indexDict.updateValue(indexDict[str]! + ["\(val)"], forKey: str)
0
JeremyP 29 Окт 2015 в 17:29