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 :(得分:2)
UserDefaults
中的所有密钥必须为String
类型。因此key
被声明为String
。因此,试图将其转换为String
毫无意义。因此警告。
您只需要:
func resetUserDefaults() {
let userDefaults = UserDefaults.standard
let dict = userDefaults.dictionaryRepresentation()
for (key,_) in dict {
userDefaults.removeObject(forKey: key)
}
}
答案 1 :(得分:1)
没有必要将某些内容转换为已知(编译器)的类型。
只需删除整个条件,然后直接使用key
。
答案 2 :(得分:1)
由于UserDefault中的键应为String类型,因此将键转换为字符串是没有用的,因此您收到此警告。
func resetUserDefaults() {
let userDefaults = UserDefaults.standard
let dict = userDefaults.dictionaryRepresentation()
for (key, _) in dict {
userDefaults.removeObject(forKey: key)
}
}
答案 3 :(得分:0)
它总是显示waring,因为dictionaryRepresentation()返回[String:Any]。
因此,当您从字符串转换为字符串时,它肯定会显示警告。 更多看到这个 - > this answer
答案 4 :(得分:0)
在Swift 5中,我的私有函数也遇到了同样的问题,并且找到了适合我的解决方案。
解决方案是将值更改为可选。 我在寻找所需的类型后添加了一个问号。 (作为String“?”)
您可以在此处查看示例:
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: difference as String? vs. as? String
Downcasting in Swift with as and as?
最好的问候