enter image description here

func resetUserDefaults() {
    let userDefaults = UserDefaults.standard
    let dict = userDefaults.dictionaryRepresentation()

    for (key,_) in dict {
        if let key = key as? String {
            userDefaults.removeObject(forKey: key)
        } else {
            #if DEBUG
                NSLog("\(key)")
            #endif
        }
    }
}

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

0
MIOSY 4 Сен 2017 в 08:50

4 ответа

Лучший ответ

Все ключи в UserDefaults должны быть типа String. Итак, key объявлен как String. Так что пытаться привести его к String бессмысленно. Отсюда и предупреждение.

Все что тебе нужно это:

func resetUserDefaults() {
    let userDefaults = UserDefaults.standard
    let dict = userDefaults.dictionaryRepresentation()

    for (key,_) in dict {
        userDefaults.removeObject(forKey: key)
    }
}
2
rmaddy 4 Сен 2017 в 05:53

У меня была та же проблема с частной функцией в Swift 5, и я нашел решение, работающее на меня.

Решением было изменить значение на необязательное. Я добавил знак вопроса после того типа, который искал. (как строка "?")

Вы можете увидеть пример здесь:

private func doSomeThing(completion: @escaping (String) -> ()) {
    let Something = somethingElse;
        if let anoterThing = something as String?{
        completion(anoterThing)
    }else{
        completion("Error at private func doSomeThing")
    }
}

Вы можете найти больше информации здесь:

https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html

Swift: разница как String? против как? строка

Даункинг в Свифте как и как?

С уважением

0
BK201 Freelance 27 Май 2019 в 16:20

Поскольку ключи в UserDefault должны иметь тип String, приведение ключа к строке бесполезно, и, следовательно, вы получаете это предупреждение.

func resetUserDefaults() {
    let userDefaults = UserDefaults.standard
    let dict = userDefaults.dictionaryRepresentation()

    for (key, _) in dict {
       userDefaults.removeObject(forKey: key)
    }
}
1
skynet 4 Сен 2017 в 05:59

Нет необходимости приводить что-либо к типу, который уже известен (для компилятора).

Просто удалите все условие и используйте ваш key напрямую.

1
Thilo 4 Сен 2017 в 05:53