Swift类型不符合协议NilLiteralConvertible

sna*_*ggs 23 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
}
Run Code Online (Sandbox Code Playgroud)

如何摆脱这个错误?

我想写下这样的东西:

func  getByEmail(email:String) -> MeeterAccount{

    var out:MeeterAccount!

    for  acct in accountsList  {
        if  acct.getEmail().equalsIgnoreCase(email)  {
            out = acct
        }
    }
    return out;
}
Run Code Online (Sandbox Code Playgroud)

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

为什么我不能回来nil

jtb*_*des 34

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


Mad*_*Nik 10

说明

文字可转换协议

例如,分配变量时

var a = 9.0
Run Code Online (Sandbox Code Playgroud)

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

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

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

说我有功能

func returnString() -> String{
   return nil
} 
Run Code Online (Sandbox Code Playgroud)

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

如果我试着返回3

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

该类型String符合协议StringLiteralConvertible,仅当您返回字符串文字时才进行匹配(例如"")

func returnString() -> String?{
   return nil
}
Run Code Online (Sandbox Code Playgroud)

这应该工作.

为什么?

因为这里的返回类型不是String,但Optional它是由斯威夫特介绍.Optional实现协议NilLiteralConvertible.在那里你被允许返回nil.

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


Ant*_*ong 6

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

func  getByEmail(email:String) -> MeeterAccount? {
Run Code Online (Sandbox Code Playgroud)