【问题标题】:Checking optional isEqualToString检查可选 isEqualToString
【发布时间】:2015-02-18 23:05:48
【问题描述】:

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: swift optional-variables


    【解决方案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!")
    }
    

    【讨论】:

    • 感谢您的回复。这仍然向我抛出错误:“在展开可选值时意外发现 nil”。这种类型的代码曾经在目标 C 中工作,但在 swift 中它真的不喜欢检查某些东西是否不为零。我错过了什么吗?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

      • P.S.在这种情况下,有没有理由使用.isEqualToString 而不是==?我想不出一个,但也许我错过了一些东西。 == 应与任一侧的 NSStringString(或字符串文字)一起使用。
      • 感谢您的回复。这有效,但前提是 person.name 已设置。如果尚未设置名称,我会收到警告“在展开可选值时意外发现 nil”。我有没有设置名称的情况,所以总结一下,我想检查它是否是“John”而不是 nil。
      • 即使没有设置name,您也应该可以使用==。检查它是否等于 John 应该足以确认它不是 nil。例如在操场上运行:let s: NSString? = nil; s == “John” // returns false, no error。你确定声明的其他部分没有被强制解包,那里可能有一个as
      • 是的,你是对的!在玩了它之后,我让它工作了。这就是我最终得到的结果,它似乎工作得很好:var person : Person = Person() let name : String? = person.name if name == "John" { println("Hello, \(name!)") } else { println("Wait a minute, you're not John!") } 非常感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2011-09-16
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      相关资源
      最近更新 更多