Не удается открыть файл игровой площадки, созданный с помощью кода - PullRequest
0 голосов
/ 05 августа 2020

Abstract :

Xcode теперь предоставляет фреймворк под названием CreateML, который предлагает функции обучения машинному обучению. Его можно использовать только в файле .playground.

Проблема :

Мой рабочий процесс страдает, потому что мне нужно вручную переписать значения Dynami c в playground, а затем снова в моем проекте Xcode.

Цель:

  • Автоматическое создание файла игровой площадки и соответствующего кода обработки mlmodel в моем проекте, так что мне не нужно вручную вносить изменения в несколько проектов

    ИЛИ

  • , чтобы включить файл игровой площадки в мою MacOS проекта и мои файлы .swift общаются с моим файлом .playground.

Текущая неудачная попытка:

  • Когда я пытаюсь чтобы автоматически создать файл игровой площадки, я не могу его открыть. Я попробовал дважды щелкнуть по нему. Я попытался перетащить его в Xcode. Я попытался щелкнуть правой кнопкой мыши и open with, но Xcode не подходил. Я получаю сообщение об ошибке.

введите описание изображения здесь

OR

  • Когда я пытаюсь добавить файл игровой площадки в свой проект. Я могу запустить только файл игровой площадки или только свой проект, я не могу понять, как заставить файл .playground взаимодействовать с .swift.

код:


public struct LogEntry: Error {
    var text: StaticString
    var type: OSLogType
    var argument: Any?
    var osLog = customLog
    
    init(text: StaticString, argument: Any? = nil, type: OSLogType = .error, osLog: OSLog = customLog) {
        self.text = text
        self.type = type
        self.osLog = osLog
        self.argument = argument
    }
    
    func log() {
        os_log(text , log: osLog, type: type, String(describing: argument))
        print(String(describing: argument))
    }
}

postfix operator *

extension Result where Failure == LogEntry {
    @discardableResult
    static postfix func *(expression: Self) -> Success? {
        switch expression {
        case .success(let win):
            return win
        case .failure(let fail):
            print(fail.localizedDescription)
            print(fail.text)
            print(fail.argument)
            return nil
        }
    }
}

extension String {
    
    static func mlplaygroundcode(
        _ csvaddy: String,
        target: String,
        modelname: String
    ) -> String {
        """
        import Cocoa
        import CreateML

        guard let stockCSV = URL(string: "\(csvaddy)") else { fatalError() }
        let stockData = try MLDataTable(contentsOf: stockCSV)
        let (trainingData, testData) = stockData.randomSplit(by: 0.8, seed: 0)
        let model = try MLRegressor(trainingData: stockData, targetColumn: "\(target)")
        let metrics = model.evaluation(on: testData)
        let predictions = try model.predictions(from: testData)
        try model.write(to: URL(fileURLWithPath: "/Users/\(NSUserName())/Desktop/iOS/TimeFountain/TimeFountain/\(modelname).mlmodel"), metadata: nil)
        """
    }
    
    
    /// Creates a csv for ml string.   self is the csv address.
    /// - Parameters:
    ///   - csvaddy: The address of the csv
    ///   - target: the target column header text
    ///   - modelname:
    /// - Returns: Returns the  playground address.
     func generateMLPlayground(
        target: String = .target,
        finalmodelname: String,
        playgroundName: String
    ) -> Result<String, LogEntry> {
        String.mlplaygroundcode(
            self,
            target: target,
            modelname: finalmodelname
        ).createFile(
            desktopPath: "iOS/TimeFountain/TimeFountain/",
            name: playgroundName, //"tesst",
            fileEnding: "playground"
        )
    }

        /// creates a file locally.
    /// - Parameters:
    ///   - desktopPath: Starts without a slash, ends with a slash.  Assumes the path starts after the desktop path is established. alt: "iOS/TimeFountain/TimeFountain/"
    ///   - name: Pass a name ie. ticker + .currentDate
    ///   - fileEnding: File ending such as csv or playground.  The period is not required.
    /// - Returns: returns a discardeable Resullt to account for multiple possible errors. 
    @discardableResult internal func createFile(
        desktopPath: String = "iOS/DataFrame/",
        name: String,
        fileEnding: String
    ) -> Result<String, LogEntry>  {
        let fileManager = FileManager.default
        var fileURL: URL?
        do {
            let path = try fileManager.url(
                for: .desktopDirectory,
                in: .allDomainsMask,
                appropriateFor: nil,
                create: false
            )
            fileURL = path.appendingPathComponent(desktopPath + name + "." + fileEnding)
            guard let fileURL = fileURL else {
                return Result(failure: LogEntry(text: "ERROR: did Not Assign File URL"))
            }
            try write(
                to: fileURL,
                atomically: true,
                encoding: .utf8
            )
        } catch let error {
            print("error creating file", error.localizedDescription)
            return Result(failure: LogEntry(text: "ERROR: error creating file"))
        }
        guard let url = fileURL else {
            return Result(failure: LogEntry(text: "ERROR: did Not Assign File URL"))
        }
        print(url.absoluteString)
        return Result(success: url.absoluteString)
    }
}

print(
    trainData.csvAddress.generateMLPlayground(
        finalmodelname: "TestMe",
        playgroundName: "TestMea"
    )*
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...