"Выражения не допускаются на верхнем уровне", если модуль не является основным .swift

Есть ли что-нибудь особенное с файлом main.swift?

Я создал проект на основе командной строки в XCode. Если я добавлю выражение println("Hello, World!"); в новый swift файл, скажем test.swift, я получу сообщение об ошибке: Expressions are not allowed at the top level

Однако это выражение размещается на верхнем уровне в main.swift, который создается XCode в новом проекте. Никакое исключение не помечено XCode.

Ответы

Ответ 1

По-видимому, да, согласно этому answer. Однако нет никаких ссылок на это поведение.

Обновление Это описано в блоге Swift:

... ранее мы сказали, что код верхнего уровня не разрешен в большинстве исходных файлов ваших приложений. Исключением является специальный файл с именем "main.swift" , который ведет себя подобно файлу детской площадки, но построен с исходным кодом вашего приложения. Файл main.swift может содержать код верхнего уровня, а также правила, зависящие от порядка. По сути, первая строка кода для запуска в "main.swift" неявно определяется как основная точка входа для программы. Это позволяет минимальной программе Swift быть одной строкой - пока эта строка находится в "main.swift" .

Ответ 2

Интересно, действительно ли это main.swift или, возможно, у вас есть два файла. Вот простая демонстрация.

Папка: swift-testy
Файлы1: main.swift
Файлы2: ex1.swift

Содержание:

main.swift

import Foundation

println("Hello, World!")

let chaulky = Dog()

chaulky.bark()

ex1.swift

import Foundation

class Dog {
    func bark() {
        println("woof") // This is a comment
    }
}

Вывод при нажатии кнопки запуска

Привет, мир! гав

Ответ 3

Если у вас несколько быстрых файлов, и вы строите проект командной строки, убедитесь, что у вас есть main.swift, который будет действовать как точка входа в ваше приложение. Кроме того, main.swift должен находиться внутри вашего модуля, вы получите следующую ошибку:

error: the package has an unsupported layout, unexpected source file(s) found: /Users/.../../Hello/main.swift

fix: переместите файл внутри модуля