如何解决此错误,无法为类型为“(Student)”的参数列表调用类型为“ String”的初始化程序

时间:2019-04-22 17:28:22

标签: swift

我正在尝试解决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,mark3:3.32)...

     

您需要获取学生s1的卷号。

我创建了一个带有rollNo,名称和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 :(得分:0)

您看到此错误,因为您试图将对象转换为字符串。

String()不迅速支持该功能,但是您可以实现 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)!)