Swift类型不符合协议NilLiteralConvertible

时间:2014-08-15 07:11:16

标签: swift

我有方法:

func  getByEmail(email:String) -> MeeterAccount{
   for  acct in accountsList  {
     if  acct.getEmail().equalsIgnoreCase(email)  {
    return acct;
    }
}
  return nil; // here I get an error: type 'MeeterAccount' does not conform to protocol NilliteralConvertible
}

如何摆脱这个错误?

我想写下这样的东西:

func  getByEmail(email:String) -> MeeterAccount{

    var out:MeeterAccount!

    for  acct in accountsList  {
        if  acct.getEmail().equalsIgnoreCase(email)  {
            out = acct
        }
    }
    return out;
}

这不会引发此错误。听起来像Swift让我只写第二种方式。

为什么我无法退回nil

3 个答案:

答案 0 :(得分:34)

如果您的函数可以返回nil,则应将其声明为... -> MeeterAccount?(可选类型)。然后调用者知道它可以是零。 (你的第二个例子有效但会崩溃,因为return out将隐式尝试解包nil。)

答案 1 :(得分:10)

解释

  

文字可转换协议

分配变量时,例如

var a = 9.0

9.0是变量a中赋值的文字。根据定义,literal是表示固定值的 符号

我的眼睛看到的是(九点零点)我的头脑将其解释为浮点值9.0。编译器也是如此。编译器看到(九点零)文字,然后它知道如何从该文字中分配正确的值。

Swift提供了一种方法来链接如何通过编译器从文字构造值。它们是字面上的可转换协议。

说我有一个功能

func returnString() -> String{
   return nil
} 
  

错误:类型'String'不符合协议   'NilLiteralConvertible'

如果我尝试返回3

  

错误:类型'String'不符合协议   'IntegerLiteralConvertible'

类型String符合协议StringLiteralConvertible,只有在您返回字符串文字时才会匹配(例如""

但是

func returnString() -> String?{
   return nil
}

这应该有用。

为什么?

因为这里的返回类型不是String而是Optional,它是由Swift引入的。 Optional实施协议NilLiteralConvertible。在那里,您可以返回nil

希望我能以一种简单的方式解释看到的背后。

答案 2 :(得分:6)

您可以在功能签名中将返回类型标记为可选(请注意MeeterAccount末尾的'?')

func  getByEmail(email:String) -> MeeterAccount? {