Swift 检查可选的isEqualToString

Swift 检查可选的isEqualToString,swift,optional-variables,Swift,Optional Variables,我有一个例子,我想检查一个可选值是否等于一个字符串。 首先我必须打开它来检查它是否存在,然后我想检查它是否等于另一个字符串。然而,这给了我一个问题,我必须写两次相同的代码。我给你举个例子: var person : Person = Person() if let name = person.name { if name.isEqualToString("John") { println("Hello, John!") }

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

    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”,另一次,如果名称不存在

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


谢谢你的帮助

由于您测试的是三种不同的条件:正确值、错误值或无值,因此会有一定数量的重复

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!")
}
通过将复制提取到一个新方法中,可以将此最小化,例如:

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()
}

可选
在Swift标准库中为其定义了一个
=
运算符:

func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
func==(左:T?,右:T?)->Bool
这意味着,如果可选项包含一个相等的值,则可以比较两个可选项。如果两个选项都为零,则它们相等,如果两个选项的值相等,则它们相等

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

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


*事实上“John”也不是一个
字符串,它是一个正在转换为
字符串的字符串文本。在这种情况下,有没有理由使用
.isEqualToString
而不是
=
?我想不出一个,但也许我错过了什么
=
应与两边的
NSString
String
(或字符串文字)一起使用。感谢您的回复。这是有效的,但仅当person.name已设置时有效。如果尚未设置名称,我会收到警告“在展开可选值时意外发现nil”。我有一些情况下没有设置名称,因此总结起来,我想检查它是否为“John”而不是“nil”。即使未设置
名称
,您也应该能够使用
=
。检查它是否等于John应该足以确认它不是零。例如,在操场上运行此命令:
let s:NSString?=无s==“John”//返回false,无错误
。您确定语句的其他部分没有被强制展开吗?其中可能有
as
?是的,您是正确的!玩过之后,我让它开始工作了。这就是我最终得到的结果,它似乎工作得很好:
var person:person=person()让name:String?=person.name if name==“John”{println(“你好,\(name!)”)else{println(“等等,你不是John!”)}
非常感谢你的帮助。谢谢你的回复。这仍然会引发错误:“在展开可选值时意外发现nil”。这种类型的代码过去在objective C中工作,但在swift中,它确实不喜欢检查某些内容是否为零。我错过什么了吗?