Squeak.ru - шаблоны программирования

Объявите функцию в Swift перед ее определением

Если я запускаю этот код на игровой площадке Swift, он работает нормально. Функция определяется до ее вызова.

import Cocoa

func addValues(valueA:Double, valueB:Double)
{
    let result = valueB + valueB
    println("Result \(result)")
}

addValues(23.83, 87.12)

Если я попытаюсь вызвать функцию до того, как она будет определена, я получу сообщение об ошибке. Не неожиданно, потому что функция все еще неизвестна компилятору. (Почему-то это все еще работает)

import Cocoa

addValues(23.83, 87.12)

func addValues(valueA:Double, valueB:Double)
{
    let result = valueB + valueB
    println("Result \(result)")
}

В Objective-C я смог объявить заголовок функции только в верхней части файла и определить функцию позже, в конце кода. Так что вторая версия моего образца тоже подойдет.

Могу ли я сделать это и в Swift? В документации ничего не нашел.

РЕДАКТИРОВАТЬ:

andyvn22 написал, что это произойдет только на игровой площадке, а не в реальных проектах, поэтому я попробовал. Просто простой инструмент командной строки с функцией. Я получаю ту же ошибку, и она не будет компилироваться. Если я перемещаю вызов после определения функции, он работает нормально.

функция

06.07.2014

  • Вы пробовали? func addValues(Double,Double) 06.07.2014
  • «Если я попытаюсь вызвать функцию до того, как она будет определена, я получу сообщение об ошибке. Не неожиданно, потому что функция все еще неизвестна компилятору. (По какой-то причине кажется, что это все еще работает)» это расплывчато. 06.07.2014
  • Если вы попытаетесь это сделать, вы просто получите две ошибки (Ожидается '{' в теле объявления функции и Недопустимое повторное объявление). 06.07.2014
  • Упс, кажется, это не проблема в классах, но это все еще проблема вне игровой площадки при прямом вызове функции. 07.07.2014
  • IMO: если вы сначала получите доступ к какой-либо функции, а затем определите ее, компилятор не будет искать дальше в вашем коде, чтобы проверить, определила ли вы функцию. Это может быть связано с тем, что Apple не хочет, чтобы Swift занимал много времени на компиляцию, как Java. 01.06.2016

Ответы:


1

Я считаю, что в Swift вы обычно не можете вызывать функции до того, как они будут объявлены, поскольку они неизвестны компилятору в то время. В Objective C это было иначе, потому что объявление функции в заголовке представляло ее компилятору во время импорта как указатель на определение функции. Затем, когда функция вызывается, компилятор может ссылаться на импортированный указатель, который затем переводит его на определение функции в файле.
В Swift это отличается, потому что мы не обязаны объявлять наши свойства в заголовочном файле — мы одновременно объявляем и определяем в одном файле. Хотя это проще, это создает проблему, похожую на вашу, когда компилятор не знает о функции до ее объявления/определения.
В классах правила изменены, потому что мы можем вызывать функции следующим образом:

    class HypnosisViewController: UIViewController {

        override func viewDidLoad() {
            // Function call
            addValues(30.0, 40.0) 
        } 

        // Function declaration
        func addValues(valueA:Double, valueB:Double){
            let result = valueB + valueB
            println("Result \(result)")
        }
    }

даже если функция не объявлена ​​​​до вызова функции. Мы можем это сделать, потому что при создании экземпляра класса все переменные экземпляра и методы этого класса инициализируются для этого объекта. Это означает, что компилятор уже инициализировал и, следовательно, распознал функцию addValues, поэтому он не жалуется.
Однако, когда код выполняется линейно, например, в Playground, у нас нет этой инициализации, поэтому невозможно вызвать функцию до ее объявления по ранее указанным причинам (компилятор не знает о функции). Нетипичное поведение Playground в такой ситуации кажется мне немного более двусмысленным, потому что он жалуется на вызов функции, предшествующий объявлению функции, но по-прежнему показывает результат вызова справа. Я считаю, что это связано с уникальным способом, которым Playground компилирует свой код.
Прошу прощения, потому что я не знаю, как сохранить эту функциональность Objective C в Swift, что, как я знаю, было частью вашего вопроса. Однако я надеюсь, что это дало вам некоторое представление о том, почему это происходит.

11.08.2014
  • Не могу поверить, что Swift не справится с этим. Похоже, в 2017 году мы сможем ссылаться на функцию, объявленную позже в том же файле. 12.12.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...