Загрузить текстовый файл в структуру массива - PullRequest
0 голосов
/ 02 мая 2018

Это struct моего массива:

struct Question {
    let imgName: String
    let questionText: String
    let options: [String]
    let correctAns: Int
    var wrongAns: Int
    var isAnswered: Bool
}

var questionsArray = [Question]()

Вот как массив заполняется в настоящее время:

let que1 = Question(imgName: "img1", questionText: "What is 2 x 2 ?", options: ["2", "4", "8", "6"], correctAns: 1, wrongAns: -1, isAnswered: false)
let que2 = Question(imgName: "img2", questionText: "What is 4 + 2 ?", options: ["9", "4", "3", "6"], correctAns: 3, wrongAns: -1, isAnswered: false)
questionsArray = [que1, que2]

Я хотел бы поместить данные в текстовый файл и заполнить мой questionsArray. Поэтому я создал файл data.txt и поместил его в пакет. Ниже приводится содержание data.txt. Каждый вопрос отделяется новой строкой.

Question(imgName: "img1", questionText: "What is 2 x 2 ?", options: ["2", "4", "8", "6"], correctAns: 1, wrongAns: -1, isAnswered: false)
Question(imgName: "img2", questionText: "What is 4 + 2 ?", options: ["9", "4", "3", "6"], correctAns: 3, wrongAns: -1, isAnswered: false)

Я пытался использовать этот метод:

var arrayOfStrings: [String]?

do {
    if let path = Bundle.main.path(forResource: "data", ofType: "txt") {
        let data = try String(contentsOfFile:path, encoding: String.Encoding.utf8)
        arrayOfStrings = data.components(separatedBy: "\n")
        questionsArray = arrayOfStrings
    }
} catch let err as NSError {
    print(err)
}

Однако я получил ошибку Cannot assign value of type '[String]?' to type '[Question]' для строки questionsArray = arrayOfStrings.

Как это решить?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Это краткое руководство для лучшего управления данными. Он широко использует ваш код.

  • Создание новой пустой игровой площадки, платформа macOS (важно!). Вы можете оставить игровую площадку, чтобы добавить больше вопросов.
  • Вставьте этот код, он создаст файл JSON questions.json на рабочем столе

    struct Question : Encodable {
        let imgName: String
        let questionText: String
        let options: [String]
        let correctAns: Int
        var wrongAns: Int
        var isAnswered: Bool
    }
    
    let que1 = Question(imgName: "img1", questionText: "What is 2 x 2 ?", options: ["2", "4", "8", "6"], correctAns: 1, wrongAns: -1, isAnswered: false)
    let que2 = Question(imgName: "img2", questionText: "What is 4 + 2 ?", options: ["9", "4", "3", "6"], correctAns: 3, wrongAns: -1, isAnswered: false)
    let questionsArray = [que1, que2]
    
    do {
        let jsonData = try JSONEncoder().encode(questionsArray)
        let url = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Desktop/questions.json")
        try jsonData.write(to: url)
    } catch {
        print(error)
    }
    
  • Перетащите файл с рабочего стола в навигатор проекта. Убедитесь, что установлен флажок Copy if needed.

  • Используйте этот код в своем проекте

    struct Question : Decodable {
        let imgName: String
        let questionText: String
        let options: [String]
        let correctAns: Int
        var wrongAns: Int
        var isAnswered: Bool
    }
    
    var questionsArray = [Question]()
    
    
    let url = Bundle.main.url(forResource: "questions", withExtension: "json")!
    let data = try! Data(contentsOf: url)
    questionsArray = try! JSONDecoder().decode([Question].self, from: data)
    
0 голосов
/ 02 мая 2018

Сохранение данных в файле - хорошая идея. Но в формате txt и особенно в этом формате ниже определенно не очень хорошая идея:

Question(imgName: "img1", questionText: "What is 2 x 2 ?", options: ["2", "4", "8", "6"], correctAns: 1, wrongAns: -1, isAnswered: false)

Вы должны использовать формат json, который идеально подходит для этого случая. Вы сохраняете данные в файл .json.

Как это сделать? Добавьте протокол Codable в вашу структуру. Вопрос:

struct Question: Codable {
    let imgName: String
    let questionText: String
    let options: [String]
    let correctAns: Int
    var wrongAns: Int
    var isAnswered: Bool
}

Затем закодируйте данные:

do {
    let encodedData = try JSONEncoder().encode(questionsArray)
    // Write encoded data to file
} catch let err {
    print(err)
}

А когда вы хотите восстановить данные:

let data = Data(contentsOf: url)
do {
    let decodedData = try JSONDecoder().decode([Question].self, from: data)
} catch let err {
    // Failed to decode data
    print(err)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...