5

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

    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”,另一次是名称不存在时。

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

谢谢你的帮助!

4

3 回答 3

9

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

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

这意味着如果可选项包含一个相等的值,您可以比较两个可选项。如果两个可选项都为 nil,则它们相等,并且如果两个可选项包装相等的值,则它们相等。

所以如果你不关心是否person.name存在nil,只关心它是否包含“John”的值,你可以写if person.name == "John".

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

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

于 2014-12-20T01:12:00.127 回答
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!")
}
于 2014-12-20T00:33:30.390 回答
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()
}
于 2014-12-20T00:33:36.487 回答