быстрая сборка с использованием неразрешенного идентификатора

Я использовал vapor для создания проекта. создайте быстрый файл, используя xcode.

структура такая:

├── Sources
│   └──App
│   │   └── Controllers
│   │   └── Models
│   │   │   └── File.swift
│   └──Run
│       └── main.swift
└── Package.swift

с main.swift

let config = try Config()
try config.setup()
let drop = try Droplet(config)
try drop.setup()
File.test()
try drop.run()

с файлом.swift

class File {

    class func test() -> Void{
        print("--\(self)--");
    }
}

приведенный выше код xcode может работать нормально. но с помощью команды swift build получить ошибку.

журнал:

Compile Swift Module 'App' (6 sources)
Compile Swift Module 'Run' (1 sources)
/Users/xxx/Documents/testServer/Sources/Run/main.swift:25:1: error: use of 
unresolved identifier 'File'
File.test()
^~~~
CoreServices.cFile:1:12: note: did you mean 'cFile'?
public var cFile: OSType { get }
           ^
<unknown>:0: error: build had 1 command failures
error: exit(1):  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Users/xxx/Documents/testServer/.build/debug.yamlhere

person Nemo Agoni    schedule 29.08.2017    source источник


Ответы (2)


Ваш main.swift находится в модуле Run, а File — в модуле App. Чтобы вызвать метод класса из другого модуля, вы должны выполнить следующее:

  1. Сделать класс (File) public
  2. Сделать метод (test) public
  3. Импортируйте модуль в файл вызывающего метода - добавьте import App к main.swift
person Vadim Eisenberg    schedule 30.08.2017
comment
Спасибо . Он начинает работать. Но как мне добавить файл класса в Run источники внутри него? - person Nemo Agoni; 31.08.2017
comment
Чтобы использовать класс File внутри исходных файлов модуля Run, просто добавьте import App к каждому исходному файлу, в котором вы будете использовать класс File. - person Vadim Eisenberg; 01.09.2017
comment
как это сделать. Можете ли вы привести пример? ссылка на сайт? - person Nemo Agoni; 03.09.2017
comment
В вашем случае: import App, а затем File.test() в файлах, которые вы хотите назвать File.test(). - person Vadim Eisenberg; 03.09.2017
comment
Может быть, я неправильно понял ваш вопрос - не могли бы вы переформулировать его? Вы спрашиваете, как вызывать методы класса File из исходных файлов модуля Run? - person Vadim Eisenberg; 03.09.2017
comment
Я имею в виду добавить класс File в модуль Run. Что я должен делать - person Nemo Agoni; 04.09.2017
comment
Чтобы добавить класс File в модуль Run, просто переместите его на диске из папки App в папку Run. - person Vadim Eisenberg; 04.09.2017

Вероятно, происходит то, что ваш класс File находится в целевом «Приложении», а ваш Main находится в целевом «Выполнить», поэтому один не может видеть другого.

Что вам нужно сделать, так это добавить строку File.test() в файл Droplet+setup.swift над функцией setup(), которая может быть в вашем проекте, расположенной над целью «Приложение».

Что-то вроде этого:

@_exported import Vapor

extension Droplet {
    public func setup() throws {
        try setupRoutes()
        // ADD YOUR CLASS CALL OVER HERE
        File.test()

    }

}
person Raul Marques    schedule 29.08.2017
comment
но как мне добавить файл класса в Run источники внутри него? - person Nemo Agoni; 31.08.2017