【问题标题】:Missing a bracket, etc. (Swift)缺少括号等(Swift)
【发布时间】:2016-03-05 18:10:16
【问题描述】:

大家好,我很难找出问题所在。在下面的函数中,当类别为减法且级别为 Hard 时,它会跳过该函数并进入除法部分。我认为我所有的措辞都是正确的,但我认为我的括号有问题。花了一个多小时试图找到它。还是不行。顺便说一句,所有其他类别和级别都有效,即使是减法。唯一错误的是硬减法,我找不到括号有什么问题。

代码:

func generate(){


    if category == "Multiplication"{
        if level == "Easy"{
    part1 = Int(arc4random_uniform(UInt32(4)))
    part2 = Int(arc4random_uniform(UInt32(4)))
    questionsLbl.text = "\(part1) x \(part2)?"
    answer = part1 * part2
    createExtraAnswers()
        }
        if level == "Medium"{
            part1 = Int(arc4random_uniform(UInt32(10)))
            part2 = Int(arc4random_uniform(UInt32(10)))
            questionsLbl.text = "\(part1) x \(part2)?"
            answer = part1 * part2
            createExtraAnswers()
        }
        if level == "Hard"{
            part1 = Int(arc4random_uniform(UInt32(14)))
            part2 = Int(arc4random_uniform(UInt32(14)))
            questionsLbl.text = "\(part1) x \(part2)?"
            answer = part1 * part2
            createExtraAnswers()
        }
    }else{
        if category == "Addition"{
            if level == "Easy"{
            part1 = Int(arc4random_uniform(UInt32(6)))
            part2 = Int(arc4random_uniform(UInt32(6)))
            questionsLbl.text = "\(part1) + \(part2)?"
            answer = part1 + part2
            createExtraAnswers()
            }
            if level == "Medium"{
                part1 = Int(arc4random_uniform(UInt32(20)))
                part2 = Int(arc4random_uniform(UInt32(20)))
                questionsLbl.text = "\(part1) + \(part2)?"
                answer = part1 + part2
                createExtraAnswers()
            }
            if level == "Hard"{
                part1 = Int(arc4random_uniform(UInt32(100)))
                part2 = Int(arc4random_uniform(UInt32(100)))
                questionsLbl.text = "\(part1) + \(part2)?"
                answer = part1 + part2
                createExtraAnswers()
            }
        }else{
            if category == "Subtraction"{
                if level == "Easy"{
                part1 = Int(arc4random_uniform(UInt32(10)))
                part2 = Int(arc4random_uniform(UInt32(10)))
                questionsLbl.text = "\(part1) - \(part2)?"
                answer = part1 - part2
                    if answer <= -1{
                        generate()
                    }
                createExtraAnswers()
                }
                if level == "Medium"{
                    part1 = Int(arc4random_uniform(UInt32(25)))
                    part2 = Int(arc4random_uniform(UInt32(25)))
                    questionsLbl.text = "\(part1) - \(part2)?"
                    answer = part1 - part2
                    if answer <= -1{
                        generate()
                    }
                    createExtraAnswers()
                }
                if level == "Hard"{
                    part1 = Int(arc4random_uniform(UInt32(100)))
                    part2 = Int(arc4random_uniform(UInt32(100)))
                    questionsLbl.text = "\(part1) - \(part2)?"
                    answer = part1 - part2

                    createExtraAnswers()

                }

            }else{
                if category == "Division"{
                    if level == "Easy"{
                    part1 = Int(arc4random_uniform(UInt32(37)))
                    part2 = Int(arc4random_uniform(UInt32(37)))
                    questionsLbl.text = "\(part1) / \(part2)?"
                    answerDub = Double(Double(part1) / Double(part2))
                  if (answerDub % 1 == 0) {
                        print("whole number confirmed")
                    print(answerDub)
                        answer = Int(answerDub)
                    print(answer)
                        createExtraAnswers()
                    } else {
                        generate()
                    }
                }
              }
                if level == "Medium"{
                    part1 = Int(arc4random_uniform(UInt32(80)))
                    part2 = Int(arc4random_uniform(UInt32(80)))
                    questionsLbl.text = "\(part1) / \(part2)?"
                    answerDub = Double(Double(part1) / Double(part2))
                    if (answerDub % 1 == 0) {
                        print("whole number confirmed")
                        print(answerDub)
                        answer = Int(answerDub)
                        print(answer)
                        createExtraAnswers()
                    } else {
                        generate()
                    }
                }
            }
            if level == "Hard"{
                part1 = Int(arc4random_uniform(UInt32(140)))
                part2 = Int(arc4random_uniform(UInt32(140)))
                questionsLbl.text = "\(part1) / \(part2)?"
                answerDub = Double(Double(part1) / Double(part2))
                if (answerDub % 1 == 0) {
                    print("whole number confirmed")
                    print(answerDub)
                    answer = Int(answerDub)
                    print(answer)
                    createExtraAnswers()
                } else {
                    generate()
                }
            }


        }
    }
}

【问题讨论】:

  • 您是否尝试过在调试器中单步执行您的代码?什么时候执行流程不符合您的预期?
  • 您从哪里获得categorylabel?在设置那些选择减法实际上将值设置为除法或其他值的值时,这可能是一个问题。另外,看看else ifsyntax in swift
  • 不要更改问题的全部内容,这会使现有答案无效。如果您有一个新的、不同的问题,请创建一个新问题。这个应该停留在它现有的话题上。谢谢。

标签: ios swift function curly-brackets


【解决方案1】:

问题出在您的if category = "Division" 代码中:

if category == "Division"{
    if level == "Easy"{
        part1 = Int(arc4random_uniform(UInt32(37)))
        part2 = Int(arc4random_uniform(UInt32(37)))
        questionsLbl.text = "\(part1) / \(part2)?"
        answerDub = Double(Double(part1) / Double(part2))
        if (answerDub % 1 == 0) {
            print("whole number confirmed")
            print(answerDub)
            answer = Int(answerDub)
            print(answer)
            createExtraAnswers()
        } else {
            generate()
        }
    }
} // the if category == "Division" statement is ending here.

删除那个括号(我在旁边添加评论的那个)并将其移到if level == "Hard" 语句下方。

附带说明一下,您的代码格式很差。如果您将所有块排成一行,则更容易发现错误。

【讨论】:

  • 当你的意思是“那个括号”你是指你复制/粘贴的最后一个括号吗?
  • @AndyLebowitz,是的,请参阅我的最新编辑。为什么你喜欢你的块格式不好。它会让你成为一个效率低得多的程序员。
【解决方案2】:

嵌套的if-else 语句是地狱。你为什么不使用switch这样的声明:

switch (category, level) {
case ("Multiplication", "Easy"):
    part1 = Int(arc4random_uniform(UInt32(4)))
    part2 = Int(arc4random_uniform(UInt32(4)))
    questionsLbl.text = "\(part1) x \(part2)?"
    answer = part1 * part2
    createExtraAnswers()
case ("Multiplication", "Medium"):
    part1 = Int(arc4random_uniform(UInt32(10)))
    part2 = Int(arc4random_uniform(UInt32(10)))
    questionsLbl.text = "\(part1) x \(part2)?"
    answer = part1 * part2
    createExtraAnswers()
// ...
}

这种方式可读性更高。

【讨论】:

  • 我就是这样的球员。这就是为什么
  • 您的个人资料显示您 18 岁?无论如何,这个问题是修辞性的。
  • 它 18,所以我可以通过所有要求或其他任何东西。我才 14 岁
【解决方案3】:

我认为 if-else 语句会产生难看的代码。由于您必须对内容进行硬编码,因此您的用例要求您在代码中包含某种类型的“丑陋”,所以这是我想出的一个小操场:

enum Difficulty{
  case Easy
  case Medium
  case Hard
}

protocol ExerciseProtocol{

  var difficulty : Difficulty {get}
  var description : String {get}
  var answer : Int {get}

}

class MathExercise : ExerciseProtocol {

  enum ExerciseType : String {
    case Multiplication = "x"
    case Addition = "+"
    case Subtraction = "-"
    case Division = "/"

  }

  var difficulty : Difficulty
  var type : ExerciseType
  var operand1 : Int
  var operand2 : Int
  var description : String{

    return "\(operand1) \(self.type.rawValue) \(operand2)"

  }

  init(type: ExerciseType, difficulty: Difficulty){

    self.difficulty = difficulty
    self.type = type

    switch difficulty{
    case .Easy:
      switch type{
      case .Addition:
        operand1 = Int(arc4random_uniform(UInt32(6)))
        operand2 = Int(arc4random_uniform(UInt32(6)))
      case .Subtraction:
        operand1 = Int(arc4random_uniform(UInt32(10)))
        operand2 = Int(arc4random_uniform(UInt32(10)))
      case .Multiplication:
        operand1 = Int(arc4random_uniform(UInt32(4)))
        operand2 = Int(arc4random_uniform(UInt32(4)))
      case .Division:
        operand1 = Int(arc4random_uniform(UInt32(37)))
        operand2 = Int(arc4random_uniform(UInt32(37)))

      }
    case .Medium:
      switch type{
      case .Addition:
        operand1 = Int(arc4random_uniform(UInt32(20)))
        operand2 = Int(arc4random_uniform(UInt32(20)))
      case .Subtraction:
        operand1 = Int(arc4random_uniform(UInt32(25)))
        operand2 = Int(arc4random_uniform(UInt32(25)))
      case .Multiplication:
        operand1 = Int(arc4random_uniform(UInt32(10)))
        operand2 = Int(arc4random_uniform(UInt32(10)))
      case .Division:
        operand1 = Int(arc4random_uniform(UInt32(80)))
        operand2 = Int(arc4random_uniform(UInt32(80)))

      }
    case .Hard:
      switch type{
      case .Addition:
        operand1 = Int(arc4random_uniform(UInt32(100)))
        operand2 = Int(arc4random_uniform(UInt32(100)))
      case .Subtraction:
        operand1 = Int(arc4random_uniform(UInt32(100)))
        operand2 = Int(arc4random_uniform(UInt32(100)))
      case .Multiplication:
        operand1 = Int(arc4random_uniform(UInt32(14)))
        operand2 = Int(arc4random_uniform(UInt32(14)))
      case .Division:
        operand1 = Int(arc4random_uniform(UInt32(140)))
        operand2 = Int(arc4random_uniform(UInt32(140)))

      }
  }

  }

  var answer : Int{
    switch self.type{
    case .Addition:
      return operand1 + operand2
    case .Subtraction:
      return operand1 - operand2
    case .Multiplication:
      return operand1 * operand2
    case .Division:
      return operand1 / operand2
    }
  }
}

并像这样使用它:

let division = MathExercise(type: .Division, difficulty: .Hard)
division.description // prints something like "5 / 5"
division.answer // prints "1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2016-08-16
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多