2017-02-25 4 views
0

안녕 얘들 아 신속하고 신속하게 몇 가지 미묘한 일을하려고. 즉, 코딩을 계속하기 전에 여기에서 내 이해를 확고히하기를 원합니다. 사전 값은 자동으로 선택 사항입니까?

error: value of optional type 'Double?' not unwrapped;

이 사전에 모든 값이 선택적임을 뜻 : 나는 다음과 같은 얻을

var content:[String:Double] = [:] 
content["swords"] = 12 
content["bows"] = 113 
content["swords"] = content["swords"] + 12 // problem line 

:이 코드를 실행 한 후? 그게 사실이라면 나는 가치없는 키만 추가해서 인쇄 할 수 있습니다.

var content:[String:Double] = [:] 
content["swords"] = 12 
content["bows"] = 113 
content["blade"] 
print(content["blade"]) 

nil 실제로 그렇습니까?

답변

0

두 가지 완전히 다른 문제가 있습니다. 두 번째 코드에서는 "blade" 키에 값을 지정하지 않으므로 print 문에 nil이 표시됩니다.

라인 :

content["blade"] 

아무것도 추가하지 않습니다. 실제로 키의 값에 액세스하려고 시도합니다.

첫 번째 비트의 문제점은 런타임시 임의의 사전 키 값에 대한 값이 있다는 보장이 없으므로 사전 조회의 값이 선택적 값이기 때문입니다.

content["swords"] = content["swords"]! + 12 

을하지만 그렇게하지 않습니다

당신은 수행하여 코드를 수정할 수 있습니다. 대신 안전하게 수행하십시오 :

if let swords = content["swords"] as? Double { 
    content["swords"] = swords + 12 
} 
0

키가 설정되어 있지 않으면 사전은 일반적으로 nil을 반환합니다. 값없이 키를 추가하지 않았 으면, 설정되지 않은 키를 두 번 읽으므로 두 번 모두 nil을 반환합니다 (한 번은 아무 것도하지 않고 두 번째로 인쇄).

+0

그러나 존재하는 값은 선택 사항입니다. 맞습니까? – Obito

+0

이것은 정의되지 않은 키를 확인해야한다는 것을 알려주는 길입니다. 그렇습니다. – Compufreak