Reputation: 45
let say I defined a class
class Dummy {
var title: String?
}
and I have a dictionary as
let foo: [Int: String?] = [:]
then when I make an assignment as below
var dummy = Dummy()
dummy.title = foo[1]
it says
Cannot assign value of type 'String??' to type 'String?'
Insert ' as! String'
return type of foo
is String?
and Dictionary
returns optional of its value type when used subscript but what is String??
type in swift?
I think it should be legal to make such assignment. Why it complains and how should I make this assignment
Upvotes: 0
Views: 981
Reputation: 114783
By declaring your dictionary as [Int:String?]
you are saying that the key is an Int
and values are optional String
s. Now the key may not be present in the dictionary, so foo[1]
optionally returns an optional and you end up with an with an optional optional - String??
Now while there are sometimes uses for optional optionals, I don't think that is what you want in this case.
You can simply make a dictionary of [Int:String]
and then not insert an element if the value is nil
.
let foo: [Int: String] = [:]
dummy.title = foo[1]
If you do need to handle the case where "there is a value for this key and it is nil
" then the nil-coalescing operator may help you:
dummy.title = foo[1] ?? nil
or even
dummy.title = foo[1] ?? ""
Upvotes: 0
Reputation: 16341
Since having a value corresponding to the key 1 in the dictionary foo
is optional and the value in the dictionary is of type String?
it returns type String??
. Unwrapping the value once to check if the value exists would fix this issue
if let value = foo[1] {
dummy.title = value
}
Upvotes: 0