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

时间:2017-09-04 05:50:24

标签: ios swift nsuserdefaults

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

我收到了这个警告。任何人都可以建议我如何避免这种战争

5 个答案:

答案 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?

最好的问候