Подтвердить что ты не робот

Тип Swift не соответствует протоколу NilLiteralConvertible

У меня есть метод:

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?

4b9b3361

Ответ 1

Если ваша функция может возвращать nil, тогда она должна быть объявлена ​​как ... -> MeeterAccount? (необязательный тип). Затем вызывающий абонент знает, что это может быть ноль. (Ваш второй пример работает, но будет аварийно, потому что return out будет неявно пытаться развернуть ноль.)

Ответ 2

Объяснение

буквальные конвертируемые протоколы

Когда вы назначаете переменную, например

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.

Надеюсь, мне удалось объяснить за увиденным простым способом.

Ответ 3

Вы можете пометить тип возврата как необязательный в сигнатуре функции (обратите внимание на "?" в конце MeeterAccount)

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