Swift по умолчанию - массив - PullRequest
       9

Swift по умолчанию - массив

0 голосов
/ 11 сентября 2018

Получение ошибки в приведенном ниже коде как

Двоичный оператор '==' нельзя применить к операндам типа '[String]?'и 'String'

    func loadDefaults() {

    let userDefaults = UserDefaults.standard.object(forKey: "storedArray") as? [String]
    if (userDefaults == "") || userDefaults != nil{
        persons = userDefaults!
    }else{
        persons = [""]
    }

}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Прежде всего, существует специальный метод array(forKey для извлечения массива.

Пустой массив isEmpty, вы не можете сравнить его с пустым String

Если выхотите загрузить сохраненный массив или назначить пустой массив, если объект не может быть найден, используйте

func loadDefaults() {
    // a variable name userDefaults for the array is confusing
    if let storedArray = UserDefaults.standard.array(forKey: "storedArray") as? [String] {
        persons = storedArray
    } else {
        persons = []
    }
}

или короче

func loadDefaults() {
    persons = UserDefaults.standard.array(forKey: "storedArray") as? [String] ?? []
}
0 голосов
/ 11 сентября 2018

В вашем коде userDefaults имеет тип [String]?, а не String, который должен быть поставлен на "". Двоичный оператор == может использоваться только между двумя экземплярами одного типа (этот тип должен использовать протокол Equatable для использования ==).

Вы можете использовать этот фрагмент, чтобы проверить, что userDefaults не nil:

if let defaults = userDefaults {
    persons = defaults
} else {
    persons = [""]
}

Или с защитным заявлением:

guard let defaults = userDefaults else {
    persons = [""]
    return
}
persons = defaults

Ваша последняя функция будет выглядеть так:

func loadDefaults() {
    let userDefaults = UserDefaults.standard.object(forKey: "storedArray") as? [String]
    if let defaults = userDefaults {
        persons = defaults
    } else {
        persons = [""]
    }
}

или:

func loadDefaults() {
    let userDefaults = UserDefaults.standard.object(forKey: "storedArray") as? [String]
    guard let defaults = userDefaults else {
        persons = [""]
        return
    }
    persons = defaults
}

P.S: persons = [""] означает, что persons будет содержать один элемент, то есть "". Если вы хотите пустой массив, используйте это: persons = []

...