【问题标题】:Swift type does not conform to protocol NilLiteralConvertibleSwift 类型不符合协议 NilLiteralConvertible
【发布时间】:2014-08-15 07:11:15
【问题描述】:

我有方法:

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;
}

这不会引发此错误。听起来斯威夫特让我只写第二种方式。

为什么我不能返回nil

【问题讨论】:

  • 第二个版本可以编译,但如果您尝试返回 nil,可能会导致崩溃。

标签: swift


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    说明

    文字可转换协议

    当你分配一个变量时,例如

    var a = 9.0
    

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

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

    Swift 提供了一种方法来挂钩编译器如何从文字构造值。它们是文字可转换的协议。

    说我有一个功能

    func returnString() -> String{
       return nil
    } 
    

    错误:类型“字符串”不符合协议 'NilLiteralConvertible'

    如果我尝试返回 3

    错误:类型“字符串”不符合协议 'IntegerLiteralConvertible'

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

    但是

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

    这应该可行。

    为什么?

    因为这里的返回类型不是String,而是Swift引入的OptionalOptional 实现协议NilLiteralConvertible。在那里你可以返回nil

    希望我设法以简单的方式解释了所见背后的原因。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多