检查可选的isEqualToString

时间:2014-12-20 00:21:39

标签: swift optional-variables

我有一个案例,我想检查一个可选的I是否等于一个字符串。 首先,我必须打开它以检查它是否存在,然后我想检查它是否等于另一个字符串。然而,这给我一个问题,我必须两次编写相同的代码。我给你举个例子:

    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!")
    }

正如你所看到的,我必须写两次else语句。一旦,如果名称存在且不是' John',那么该名称不存在的另一个时间。

我的问题是,如何以正确的方式做到这一点。

感谢您的帮助!

3 个答案:

答案 0 :(得分:9)

Optional在Swift标准库中为其定义了==运算符:

func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

这意味着如果可选项包含一个等于的值,则可以比较两个选项。如果两个选项都是零,那么它们是相等的,如果两个选项包装相等的值,那么它们是相等的。

因此,如果您不关心person.name是否nil,只要它是否包含值“John”,您就可以写if person.name == "John"

当“John”是String而不是String?时,它是如何工作的?*因为Swift将隐式地将任何类型转换为可选的包装类型,如果这是一个参数需要的话。因为用于比较选项的==函数需要String?参数,“John”将隐式转换为{Some "John"},允许使用两个选项之间的==运算符。

*实际上“John”也不是String,它是一个字符串文字转换为String

答案 1 :(得分:1)

var person : Person = Person()
let name = person.name
if (name != nil && name! == "John")
{
    println("Hello, John!")
}
else
{
    println("Wait a minute, you're not John!")
}

答案 2 :(得分:0)

由于您正在测试三种不同的条件,正确的值,不正确的值或没有值,因此会有一些重复。

这可以通过将复制提取到新方法中来最小化,例如:

func notJohn() {
    println("Wait a minute, you're not John!")
}

if let name = person.name {
    if (name == "John") {
        println("Hello, John")
    } else {
        notJohn()
    }
} else {
    notJohn()
}