Как исправить эту ошибку, нельзя вызвать инициализатор для типа 'String' со списком аргументов типа '(Student)' - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь решить проблему в хакерранке, которая гласит:

Напишите программу для хранения сведений о 5 студентах. - Номер броска, имя, оценки 3 предметов

Вы можете указать данные, как показано ниже:

var s1 = Студент (номер ролика: 1, имя: «Алан», mark1: 1.45, mark2: 2.50, mark3: 3.43)
var s2 = Student(rollNo: 1, имя: «Бен», mark1: 1.448, mark2: 2.50, mark3: 3.32) ...

Вам нужно получить номер ученика s1.

Я создаю структуру с rollNo, name и mark1, mark2, mark3 и затем читаю из STDIN.Но когда я пытаюсь написать результат, я получаю эту ошибку.Может кто-нибудь объяснить, что я делаю не так?

struct Student {
    var rollNo: Int
    var name: String
    var mark1: Double
    var mark2: Double
    var mark3: Double
}

let fileName = ProcessInfo.processInfo.environment["OUTPUT_PATH"]!
FileManager.default.createFile(atPath: fileName, contents: nil, attributes: nil)
let fileHandle = FileHandle(forWritingAtPath: fileName)!

guard let roll = Int((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!) else { fatalError("Bad input") }

guard let n = readLine() else { fatalError("Bad input") }

guard let m1 = Double((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!) else { fatalError("Bad input") }

guard let m2 = Double((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!) else { fatalError("Bad input") }

guard let m3 = Double((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!) else { fatalError("Bad input") }

let result = Student(rollNo: roll, name: n, mark1: m1, mark2: m2, mark3: m3)

fileHandle.write(String(result).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)

1 Ответ

0 голосов
/ 23 апреля 2019

Вы видите эту ошибку, потому что вы пытаетесь преобразовать объект в строку.

String () не поддерживает это в swift, но вы можете реализовать протокол CustomStringConvertable и получить аналогичный результат

Измените свою модель, чтобы она выглядела примерно так:

struct Student: CustomStringConvertible {

    var rollNo: Int
    var name: String
    var mark1: Double
    var mark2: Double
    var mark3: Double

    ///Change this to how you want your output to be formatted.
    var description: String { return "name: \(name) rollNumber: \(rollNo) mark1: \(mark1) mark2: \(mark2) mark3: \(mark3)"}
}

Теперь, чтобы записать этот объект ученика в файл, вы можете сделать это:

fileHandle.write(result.description.data(using: .utf8)!)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...