I'm trying to implement a Dictionary extension and I want to handle optional values. But whatever I do, if I use my method on a [String: String?] dictionary, it fails to optionally bind the value. How do you write an extension to a dictionary that gracefully handles optional values?
Consider the following extension:
extension Dictionary {
func someMethod() {
for (key, value) in self {
if let valueString = value as? String {
println(" \(key) = \(valueString)")
} else {
println(" \(key) = \(value) cannot be cast to `String`")
}
}
}
}
So consider the following code:
let dictionary: [String: AnyObject?] = ["foo": "bar"]
dictionary.someMethod()
And it curiously reports
foo = Optional(bar) cannot be cast to `String`
I can write a non-extension method that handles dictionary parameters with optional values, but don't see how to do it as an extension of Dictionary.
You could do this with reflection. Doesn't require much more code than you already have:
extension Dictionary
{
func someMethod()
{
for (key, value) in self
{
var valueRef = _reflect(value)
while valueRef.disposition == .Optional && valueRef.count > 0 && valueRef[0].0 == "Some"
{
valueRef = valueRef[0].1
}
if let valueString: String = valueRef.value as? String
{
print(" \(key) = \(valueString)")
}
else
{
print(" \(key) = \(value) cannot be cast to `String`")
}
}
}
}
let dictionary: [String : AnyObject?] = ["foo" : "bar"]
dictionary.someMethod()
Returns
foo = bar
let dictionary: [String : AnyObject?] = ["foo" : nil]
dictionary.someMethod()
Returns
foo = nil cannot be cast to `String`
let dictionary: [String : AnyObject?] = ["foo" : UIViewController()]
dictionary.someMethod()
Returns
foo = Optional(<UIViewController: 0x7fee7e819870>) cannot be cast to `String`
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With