为什么我不能在Swift中使用'object == nil'?

时间:2014-08-23 12:09:49

标签: swift

我有简单的方法(希望语法正确)

func  foo() -> WmGroupItemSample?{

        var sample:WmGroupItemSample?

        if(a > 0){ // some condition
            sample = mGroupItemSampleList[0]
        }
        else{
           // do nothing
        }

        return sample
    }

据我所知,foo方法可能会返回nil,如果语句a>0没有发生。因此,返回类型为:WmGroupItemSample?

我对这种方法称之为怀疑:

var sample:WmGroupItemSample? = foo()

    if let temp = sample{
        return sample.getStartDate()
    }
    else{
         return -1
    }

这是验证的正确方法,如果不是nil 吗?我使用Beta 6

如果我在没有?!的情况下拨打电话会有什么不同:

var sample:WmGroupItemSample = foo()

或:

var sample:WmGroupItemSample! = foo()

为什么我无法验证sample

if sample == nil {
   /* do one*/
 }
else {

}

2 个答案:

答案 0 :(得分:8)

要将值与nil进行比较,必须允许其为?标记为零。这意味着该值可以(可能)为nil。所以默认情况下:

var a : String

不能是零。要允许字符串为零,您必须这样做:

var a : String?

使用!调用变量会解包一个可选值

  

"尝试使用!访问不存在的可选值会触发a   运行时错误。始终确保可选项包含非零值   使用前的价值!强行解开它的价值。"摘录自:Apple   Inc." Swift编程语言。"

的iBooks。 https://itun.es/pl/jEUH0.l

有关更多信息,我建议:

读数。此外SO question with answer可能会有所帮助。

答案 1 :(得分:2)

您可能必须实现Equatable或Comparable协议。 使用全局函数实现Equatable协议

func ==<T>(lhs:T, rhs: T?)-> Bool{
return lhs == nil 
}

//在您的类中,您现在可以在类定义中扩展Equatable协议。即

class ClassName: Equatable{
   // properties and functions
}