好的,我不知道这里发生了什么。我在下面有一个字典字典:
!
并且我无法在没有打印的情况下打印键值对中的值的值#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}}
我检查以确保值不是零,所以如果我打开它就不会崩溃。但这是打印的内容,并将“可选”一词附加到我的另一个数组中:
答案 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)
答案 2 :(得分:0)
animals[selected]
是Optional<Optional<String>>
,因为您正在存储nil
。你可以:
if let
或!
两次打开您的价值。[String: String]
(而不是[String: String?]
),从而避免nil
值。nil
值,然后将其作为[String: String]
您可以使用this question中的代码展平字典。
答案 3 :(得分:0)
func addAnimal(_ animal: String) {
guard let animal = animals[animal] else {
print("No pair")
return
}
animalsToReturn.append(animal ?? "")
}