如何在func swift 4中编写有关比较布尔值的func

时间:2018-09-08 11:07:26

标签: arrays swift swift-playground

编写一个函数,如果该学生的平均成绩高于给定参数的另一名学生,则该函数返回true。

这里是我的代码

class Student {  

var id: Int = 0
var firstName: String = ""
var lastName: String = "" 

init(id: Int,firstName: String,lastName: String){
    self.id = id
    self.firstName = firstName
    self.lastName = lastName

    }

func fullName() -> String  {

    return "\(firstName) \(lastName)"
    }

var grades: [Float] = []

func addGrade(_ input: Float)    {
    grades.append(input)


}
func numberOfGrades() -> Int {
    return grades.count
}
func average(numbers: Int...) -> Float {
    assert(grades.count > 0)
    return Float(grades.reduce(0, {$0 + Double($1)})/Double(grades.count))
}

func hasHigherAverageThan() -> Bool {
    if  lois.hasHigherAverageThan(peter){
    print("\(lois.firstName) beats \(peter.firstName)")
    }                        
} 
}
let peter = Student(id: 5, firstName: "Peter", lastName: "Parker")
peter.addGrade(2.95)
peter.addGrade(3.45) 
let lois = Student(id: 6, firstName: "Lois", lastName: "Lane")
lois.addGrade(4.0)
lois.addGrade(3.2)      

如何正确编写代码

我要输出:打印“ Lois beats Peter”

2 个答案:

答案 0 :(得分:0)

如果唯一的比较方法是学生的成绩,请考虑以下几点:

func hasHigherGradeThan(_ student: Student) -> Bool {
     //In your current construct, the parameter passed to "average" is not necessary, so I'm passing a 0 right now.
     return self.average(numbers: 0) > student.average(numbers: 0)
}

仅当一个平均值大于另一个平均值时,才返回true。如果平均值等于或小于平均值,则将返回false。

答案 1 :(得分:-1)

在我看来,您应该编写一个Student类的实例方法,该方法将另一个Student作为参数并比较两者:

用于比较2个Student对象的平均成绩的函数不应包含任何针对特定学生的代码。应该将其编写为实例方法,以将当前学生与另一个学生进行比较。

class Student {
   //Your other code here...

   func hasHigherAverageThan(otherStudent: Student) -> Bool {
     //Your code to compare the current student to otherStudent goes here
     //comare `self` to `otherStudent` and return a Bool result
   }
}

然后,在Student类之外,您将创建并比较2个学生:

let peter = Student(id: 5, firstName: "Peter", lastName: "Parker")
peter.addGrade(2.95)
peter.addGrade(3.45) 
let lois = Student(id: 6, firstName: "Lois", lastName: "Lane")
lois.addGrade(4.0)
lois.addGrade(3.2)      

if  lois.hasHigherAverageThan(peter) {
    print("\(lois.firstName) beats \(peter.firstName)")
} else {
    print("\(peter.firstName) beats \(lois.firstName)")
}

(请注意,上面的代码不允许2名学生的平均成绩完全相同。)

查看是否可以为hasHigherAverageThan(otherStudent:)方法编写代码。

编辑:

另一件事:您为Student对象提供了一个等级值数组,这似乎是合理的。为什么您的平均函数采用任何参数,而不是可变参数?应该写成没有参数的

func average() -> Float 

它将使用数组grades来计算平均成绩。

编辑#2:

我会这样重写您的平均函数:

func average() -> Float {
    guard !grades.isEmpty else { return 0.0 } 
    return Float(grades.reduce(0.0, { $0 + Double($1) })/Double(grades.count))
}

更改:

  1. 摆脱参数
  2. 摆脱断言,如果数组为空,则返回0

(您还可以使其返回Optional Float / Double,如果数组为空,则返回nil。)

我还建议设置一种浮点类型并在整个过程中使用它。 Double是本机浮点类型,因此我将使成绩数组成为Doubles数组,并使average()函数返回Double