Swift Dictionary<String, Any> 获取可选值

标签 swift macos option-type

自从我在 macOS 中完成任何工作已经有大约几年了,自从我接触 Swift 以来已经有两年多了。我在这方面陷入困境:

我有两个函数,第一个包含一个 while 循环来检查第二个返回的字典中的值。 :

func checkPath(_ strPath:String) { 

...
while bIsDesktop == false {
    let dictResults:Dictionary<String, Any> = checkPath(arrPath)

    if dictResults["isDesktop"] { //-->I'm getting crushed here
        //do something with returned array
    }

}

private func checkPath(_ arrPath:Array<String>) -> Dictionary<String, Any> {
    var bIsDesktop = false
    var arrPath = arrPath
    if arrPath[0] != "Desktop" {
       arrPath.removeFirst()
    } else {
       bIsDesktop = true
    }

    return ["paths":arrPath, "isDesktop":bIsDesktop]
}

arrPath 是一个字符串数组(文件路径项)

我知道返回的字典是这样的 [String:Any]

问题是无论我做什么我都会遇到某种编译器错误,例如:

Optional type 'Any?' cannot be used as a boolean; test for '!= nil' instead

在更宏大的方案中,如果有更优雅的解决方案,我正在尝试做的是去除用户选择的文件夹的路径///File:User/username/Desktop/.. . 并且只有 Desktop/... 如果有比我正在尝试的更好的解决方案,我会很高兴看到它,但如果你也能解释为什么我不能从字典中得到可选的,我也会很感激.

我试过:

guard let bIsDesktop = dictResults["isDesktop" as Bool else { ...
if dictResults?["isDesktop"]...

和其他各种排列。我得到 nil 或编译器错误。

最佳答案

我确实认为你遇到了一个复杂的错误,我没有测试你的整个故事。对此我深表歉意,并且仍在尝试将此作为解决方案发布。

据我所知,您正在尝试使用以下语句查看变量是否为真:

if dictResults["isDesktop"] { //-->I'm getting crushed here
        //do something with returned array
    }

问题是您知道或暗示 dictResult["isDesktop"] 处的字典条目是一个 bool 值。但是,您的编译器不知道,因为您向它提供了它可以是“Any”类型的知识。

编译器对此不太满意,因为它无法确定“Any”类型是真还是假。

据我了解,您首先必须将 dictResult["isDesktop"] 转换为 bool 值,然后才能要求编译器评估它是真还是假。如果您不将其转换为 bool 值,则必须将其视为非 bool 类型,并在 if 语句中告诉编译器将其计算为您想要的值。

编译器错误基本上是在告诉您:“我不知道 Any? 是什么类型,但我知道它可以是某个值或没有值。如果您输入语句“if (type),我假设您想要我来评估这个可选值是否有值(value)。这不是你想要的,你想告诉编译器它需要将语句评估为 bool。

我认为两者都可以:

if let result = dictResults["isDesktop"] as? bool {

}

if (dictResults["isDesktop"] as bool) {

}

同样,我还没有测试过,很抱歉。我确实认为这是解决这个问题的办法。

亲切的问候, Mac用户T

关于Swift Dictionary<String, Any> 获取可选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58809246/

相关文章:

Swift:如果 do return try 失败,则执行 catch

objective-c - AutoLayout中如何取较大的高度作为父高度

混帐添加。失败,提示目录不存在

swift - 可选展开 SKPhysics 错误

java - 当字段为可选时,jackson 不会从 json 读回数据

Java 8 map 签名 : public<U> Optional<U> map(Function<? super T, ? extends U> mapper)--为什么有两个U?

ios - 放松 segue 干扰 shoe segue

swift - 了解 swift 函数中的保留循环,Matt Neuburg 书中的一个例子

swift - 避免 switch 支持没有类的多态性

bash - 在 Mac 上设置 PATH 以使其在 session 之间持续存在