Что означают эти сообщения об ошибках Swift? (Функция объявляет непрозрачный тип возврата ...) - PullRequest
0 голосов
/ 21 марта 2020

У меня есть простая структура Swift (это SwiftUI)

Это оригинал ...

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

Если я добавлю один простой оператор присваивания, например, я получить кучу ошибок:

struct ContentView: View {
    var body: some View {
        let x = 1
        Text("Hello, World!")
    }
}

Почему я получаю эти сообщения об ошибках? Что они имеют в виду? (Я понимаю # 2, но я не получаю # 1 и # 3) Почему я получаю эти сообщения после добавления простого оператора присваивания?

  1. Функция объявляет непрозрачный тип, но не имеет возврата операторы в его теле, из которых можно вывести базовый тип.
  2. Инициализация неизменяемого значения 'x' никогда не использовалась; рассмотрите возможность замены присвоением «_» или удаления.
  3. Результат инициализатора «Текст» не используется.

Ответы [ 2 ]

3 голосов
/ 21 марта 2020

В первом фрагменте кода вы используете Неявные возвраты от замыканий с одним выражением . Это означает, что если замыкание состоит только из одной строки, компилятор неявно возвращает значение этой строки. Однако, если ваше закрытие длиннее, вам нужно явно написать return

struct ContentView: View {
    var body: some View {
        let x = 1
        return Text("Hello, World!")
    }
}

Два других - просто предупреждения, и они означают одно и то же: вы объявляете что-то, но никогда не используете это. Вы никогда не используете x, и, поскольку вы больше не пользуетесь неявным возвратом из замыкания, вы также никогда не используете Text.

1 голос
/ 21 марта 2020

Одной из новых возможностей Swift 5 является то, что мы можем опустить слово return, если свойство метода / вычисляемого состоит только из одного оператора return. Итак, это:

func f() -> Int {
    return 1
}

можно упростить до:

func f() -> Int {
    1
}

Так что, если мы развернем первый фрагмент кода, он станет:

var body: some View {
    // the word "return" is implicitly added
    return Text("Hello, World!")
}

Это вычисляемое свойство с именем body.

Когда вы добавляете еще одну строку, вычисляемое свойство больше не состоит только из одного оператора return, поэтому теперь слово return нельзя опускать. Компилятор пытается найти оператор возврата, но не может, следовательно, ошибка №1.

Поскольку компилятор не знает, что вы на самом деле привязываете к return Text(...), это сбит с толку, почему вы вызываете инициализатор и ничего не делаете с ним, следовательно, ошибка # 3.

...