Swift 3:无法从Dictionary中解包可选?

时间:2016-12-29 17:35:45

标签: ios swift swift3 optional

好的,我不知道这里发生了什么。我在下面有一个字典字典:

!

并且我无法在没有打印的情况下打印键值对中的值的值#34;可选"随之而来。

我尝试使用!! var animalsToReturn = [String]() if animals[selected]! != nil { if let pairName = animals[selected] { print("\(pairName)") print("has pair",selected, animals[selected]!) //trying to append to another array here animalsToReturn.append("\(animals[selected]!)") animalsToReturn.append(selected) } } else { print("no pair") } 并将其作为字符串以及以下内容进行投射:

{{1}}

我检查以确保值不是零,所以如果我打开它就不会崩溃。但这是打印的内容,并将“可选”一词附加到我的另一个数组中:

enter image description here

4 个答案:

答案 0 :(得分:4)

您已将nil作为值包含在内,因此字典值的类型不是字符串,而是Optional<String>。但是从字典中获取键值本身就是一个可选项。因此:

  • 如果您的条目存在并且最终是一个字符串,则它是Optional<Optional<String>>,您必须将其解包两次。

  • 如果您的条目存在且最终为nil,则该条目为可选换行nil

  • 如果您的参赛作品不存在,则为nil

您可以按照以下方式轻松测试:

func test(_ selected:String) {
    var animals = ["max": "z", "Royal": nil]
    if let entry = animals[selected] { // attempt to find
        if let entry = entry { // attempt to double-unwrap
            print("found", entry)
        } else {
            print("found nil")
        }
    } else {
        print("not found")
    }
}
test("max") // found z
test("Royal") // found nil
test("glop") // not found

对这个例子的考虑将回答你原来的问题,即&#34;我不知道这里发生了什么&#34;。

答案 1 :(得分:0)

请将其括在括号中并使用双重展开。试试这个: -

animalsToReturn.append("\((animals[selected])!!)")

tried in playground

答案 2 :(得分:0)

animals[selected]Optional<Optional<String>>,因为您正在存储nil。你可以:

  1. 使用if let!两次打开您的价值。
  2. 将字典类型更改为[String: String](而不是[String: String?]),从而避免nil值。
  3. 展平字典,删除nil值,然后将其作为[String: String]
  4. 进行访问

    您可以使用this question中的代码展平字典。

答案 3 :(得分:0)

func addAnimal(_ animal: String) {
    guard let animal = animals[animal] else {
        print("No pair")
        return
    }
    animalsToReturn.append(animal ?? "")
}