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

Posted

技术标签:

【中文标题】如何在 func swift 4 中编写关于比较布尔值的 func【英文标题】:how to write func about comparing boolean in func swift 4 【发布时间】:2018-09-08 11:07:26 【问题描述】:

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

【问题讨论】:

这听起来像是课堂作业。您是否可以在不违反学校规定的情况下获得课堂作业帮助? 是的,这是我的考试练习 【参考方案1】:

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

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。

【讨论】:

我认为如果 OP 自己制定出方法的主体会更好。为学生提供可复制和粘贴的代码意味着他们不学习如何自己解决问题。 @Duncan-C,我明白你在说什么。话虽如此,我坚信在有能力的情况下回答问题。人们以不同的方式学习;我相信人们对不同编码方法的接触越多,他们就会变得越好。【参考方案2】:

在我看来,您应该编写一个 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))

变化:

    去掉参数 去掉断言,如果数组为空则返回 0

(你也可以让它返回一个OptionalFloat/Double,如果数组为空则返回nil。)

我还建议选择一种浮点类型并始终使用它。 Double 是本机浮点类型,因此我会将成绩数组设为 Doubles 数组,并使 average() 函数返回 Double

【讨论】:

谢谢您的回答

以上是关于如何在 func swift 4 中编写关于比较布尔值的 func的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何从视图之外的 func 访问@Published var?

如何在 Swift 5.2-Xcode 版本 11.5 上覆盖 func observeValueForKeyPath

是否可以编写返回文本视图 HStack 的 func、方法、结构、扩展、类?

如何在 Swift 4 中为 JSON 编写可解码,其中键是动态的?

关于swift中函数的定义

swift 4.2 - 如果var具有有效的枚举值,我如何检查guard