I have a case where I want to check if an optional I have is Equal to a string. First I have to unwrap it to check if it exists, then I want to check if it is equal to another string. However that gives me a problem where I have to write the same code twice. I'll give you an example:
var person : Person = Person()
if let name = person.name {
if name.isEqualToString("John") {
println("Hello, John!")
}
else {
println("Wait a minute, you're not John!")
}
else {
println("Wait a minute, you're not John!")
}
As you can see, I have to write the else statement twice. Once, if the name exists and it is not 'John', and another time for when the name does not exist.
My question is, how can this be done the proper way.
Thanks for your help!
Optional
has an==
operator defined for it in the Swift standard library:That means if the optional contains a value that’s equatable, you can compare two optionals. If the two optionals are both nil they’re equal, and if the two optionals wrap values that are equal, then they’re equal.
So if you don’t care about whether
person.name
isnil
or not, just whether it contains a value of "John", you can just writeif person.name == "John"
.How does that work, when "John" is a
String
not aString?
?* Because Swift will implicitly convert any type to an optional wrapping that type if that’s what an argument requires. So because the==
function for comparing optionals requires aString?
argument, “John” will be implicitly converted to{Some "John"}
, allowing the==
operator between two optionals to be used.* well actually "John” isn't a
String
either, it’s a string literal that is getting converted into aString