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

Аргумент для общего параметра не может быть выведен

Я пытаюсь сохранить массив с помощью NSUserDefaults, а затем загрузить массив, но я получаю сообщение об ошибке "аргумент для общего параметра не может быть выведен". Я что-то делаю неправильно? Кажется, что в этой ситуации нет такой проблемы, поэтому я не могу найти никаких решений.

IBAction func loadData(sender: AnyObject) {
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array {        
        self.showDataLabel.text = defaults.objectForKey("testScoreSATArray") as Array
    }
}
4b9b3361

Ответ 1

Причина, по которой вы получили исходную ошибку, заключается в том, что в Swift Array - это общий контейнер, который содержит значения определенного типа. Таким образом, вы можете иметь Array<Int>, который содержит целые числа, или Array<String>, который содержит строки. Но у вас не может быть только Array. Тип вещи, содержащейся в массиве, - это общий параметр, и Свифт жалуется, потому что он не может понять, что это за тип. Иногда он может вывести этот тип из контекста кода вокруг него, но не всегда, как в этом случае.

Вы можете решить проблему, указав тип вещи, которую вы храните:

IBAction func loadData(sender: AnyObject) {
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> {

            self.showDataLabel.text = toString(testCompositeArray)
    }
}

Вместо записи Array<Int> вы можете написать более короткую форму [Int]

Вы также можете решить проблему, используя NSArray, как вы нашли. В отличие от Array, NSArray не использует generics, так как он возникает в Objective-C, который имеет другой подход к Swift. Вместо этого NSArray содержит только один вид вещи, AnyObject. Это ссылка, которая может указывать на экземпляры любого класса.

Тем не менее, theres большой недостаток в использовании NSArray и AnyObject, который заключается в том, что каждый раз, когда вы используете значение, которое они содержат, вам часто приходится "бросать" значение в реальную вещь, например целое или строка. Это может быть болью и, что еще хуже, иногда может вызывать ошибки, когда вы предполагаете, что у вас есть одна вещь, когда на самом деле у вас есть другой. Swift обычно поощряет вас более конкретно относиться к типам, чтобы избежать таких ошибок.