首页 > 解决方案 > 如何修复此错误无法使用“(学生)”类型的参数列表调用“字符串”类型的初始化程序

问题描述

我正在尝试解决hackerrank中的一个问题,该问题说:

编写一个程序来存储 5 个学生的详细信息。- 卷号、姓名、3 个科目的分数

您可以提供以下详细信息:

var s1 = Student(rollNo:1, name:"Alan",mark1:1.45,mark2:2.50,mark3:3.43)
var s2 = Student(rollNo:1, name:"Ben",mark1:1.448,mark2:2.50,标记3: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)!)

标签: swift

解决方案


You are seeing this error because you are trying to convert an object to a string.

String() doesn't support that in swift but you can implement the CustomStringConvertable protocol and get a similar result

Change your model to look something like this:

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)"}
}

Now to write this student object to a file you can do this:

fileHandle.write(result.description.data(using: .utf8)!)

推荐阅读