从字符串到字符串的条件转换总是在 swift 中成功 3

Conditional cast from string to string always succeds in swift 3

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
        }
    }
}

我收到此警告。谁能建议我如何避免这种警告

无需将某些内容强制转换为(编译器)已知的类型。

只需删除整个条件并直接使用您的 key

UserDefaults 中的所有键都必须是 String 类型。所以 key 被声明为 String。因此,尝试将其转换为 String 是毫无意义的。因此警告。

您只需要:

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

    for (key,_) in dict {
        userDefaults.removeObject(forKey: key)
    }
}

它总是会显示警告,因为 dictionaryRepresentation() return [String : Any].

所以当你从字符串转换为字符串时,它肯定会显示警告。 有关更多信息,请参阅此 -> https://developer.apple.com/documentation/foundation/userdefaults/1415919-dictionaryrepresentation

由于 UserDefault 中的键应该是字符串类型,将键转换为字符串是没有用的,因此您会收到此警告。

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

    for (key, _) in dict {
       userDefaults.removeObject(forKey: key)
    }
}

我在 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: difference as String? vs. as? String

Downcasting in Swift with as and as?

此致