如何在func swift 4中编写关于比较boolean的函数

问题描述 投票:-2回答:2

如果学生的平均成绩高于作为参数给出的另一个学生,则写一个返回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”

arrays swift swift-playground
2个回答
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
投票

听起来像你应该写一个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是本机浮点类型,因此我将使得等级数组成为双打数组,并使average()函数返回Double

© www.soinside.com 2019 - 2024. All rights reserved.