为什么在SWIFT Xcode中我的else if行会得到预期的表达式?(基本)

为什么在SWIFT Xcode中我的else if行会得到预期的表达式?(基本),swift,Swift,我对编码一无所知,一直在通过skillshare和Udemy等资源学习。在其中一个项目中,我被要求创建一个简单的应用程序,它具有1-100个随机数生成器的功能。然后,文本输入中的数字应该告诉我们输入的数字是大于还是小于随机生成的数字 代码如下: @IBOutlet weak var numberText: UITextField! @IBAction func guessButton(_ sender: Any) { randomNumber(guess: "guess") } @IB

我对编码一无所知,一直在通过skillshare和Udemy等资源学习。在其中一个项目中,我被要求创建一个简单的应用程序,它具有1-100个随机数生成器的功能。然后,文本输入中的数字应该告诉我们输入的数字是大于还是小于随机生成的数字

代码如下:

@IBOutlet weak var numberText: UITextField!

@IBAction func guessButton(_ sender: Any) {
    randomNumber(guess: "guess")
}
@IBOutlet weak var answerText: UILabel!

var random = arc4random_uniform(100);

func randomNumber (guess: String) {
    if Int(numberText.text!) != nil {
        let numGuess = Int(numberText.text!);
        let random = Int(arc4random_uniform(100));
    else if numGuess! > random {
            answerText.text = "try a smaller number"
    else if numGuess! < random {
            answerText.text = "try a larger number"
            }
    else if numGuess! == random {
            }
        }

        answerText.text = "you got it right, the answer is \(numGuess)!"

    } else {
        answerText.text = "Try typing numbers from 1-100"
    }
}
@IBOutlet弱变量numberText:UITextField!
@iAction func猜测按钮(\发送方:任意){
随机数(猜测:“猜测”)
}
@IBVAR弱应答文本:UILabel!
var random=arc4random_均匀(100);
func随机数(猜测:字符串){
如果Int(numberText.text!)!=nil{
让numGuess=Int(numberText.text!);
设random=Int(arc4random_均匀(100));
否则,如果numGuess!>随机{
answerText.text=“尝试较小的数字”
否则,如果numGuess!
我想知道为什么我的else-if代码会出现错误“expected expression”。此外,是否可以对开关箱执行此操作


我不确定我的方法是否是创建这个应用程序的正确方法,所以请随时给我一些提示

if-else
语句所需的语法为

if condition1 {
   // condition1 is true
} else if condition2 {
   // condition2 is true
} else {
  //
}
所有支架必须保持平衡

你的代码被清理了,并且有了更好的数字检查应该是

func randomNumber() { // The `guess: String` parameter is not used

    if let number = numberText.text, let numGuess = Int(number), 1...100 ~= numGuess {

        // random_uniform(100) creates numbers between 0 and 99
        let random = Int(arc4random_uniform(100)) + 1 

        if numGuess > random {
            answerText.text = "try a smaller number"

        } else if numGuess < random {
            answerText.text = "try a larger number"

        } else { // the numbers are equal
            answerText.text = "you got it right, the answer is \(numGuess)"
        }

    } else {
        answerText.text = "Try typing numbers from 1-100"
    }
}
func randomNumber(){//未使用'guess:String'参数
如果让number=numberText.text,则让numGuess=Int(number),1…100~=numGuess{
//random_uniform(100)创建0到99之间的数字
设random=Int(arc4random_均匀(100))+1
如果numGuess>random{
answerText.text=“尝试较小的数字”
}否则,如果numGuess
首先是答案,然后是一些解释。(实际上是先假设一下!)

我的假设是: 您在某处声明了两个UILabel

var numberText = UILabel()
var answerText = UILabel()
这些可能是在代码中(就像我做的或其他),或者在IB中,并且您已经连接了IBOutlet

现在代码是: 如果或else,请在
else之前注意关闭制动器*。但我认为这可能是您的一个简单类型,您的代码的真正问题是

  • 称为变量范围的东西
请注意我对这两行代码的移动:

let numGuess = Int(numberText.text!);
let random = Int(arc4random_uniform(100));
因为它们在<代码>的**第一*部分中,如果。。。否则如果。。。else
子句,它们在其他部分中不可用(可访问)。如果将它们移出整个
”语句,则可以使用它们

编辑 现在出现了一个新的问题——解包坏值。让我们看一行代码,然后看第二行:

} else if numGuess! > random {
这是给你一个问题的一行。显然,
numGuess
是问题所在。同样明显的是,它不是Int。让我们看第二行:

let numGuess = Int(numberText.text!);
这里有几件事不对。首先是分号,也是非常小的一个。摆脱它。它不需要,也不“快速”

下一步,至少在你知道发生了什么之前,它做的太多了。您可以将其分解为几行,这将有助于调试:

let strGuess = numberText.text!  // this is an unwrapped staring representing what's in this textfield
let intGuess = Int(strGuess) // this is an Int representation of what was entered
虽然这可能有助于解决问题,但它的编码非常糟糕。如果文本字段中未输入任何内容,会发生什么情况?如果输入了“abc”或“123abc”,会发生什么情况?您看到的是一个流程错误-正是您现在看到的

一些背景-您最初的问题有一个构建错误。它不知道numGuess是什么,因为它不在范围内。我移动了它,纠正了构建错误,但是由于您如何声明
numberText
控件,它现在生成了一个处理错误

还有一件让你非常困惑的事情-为什么你的函数
randomNumber(guess:)
从不使用输入参数
guess

以下是您可以做的:

// Some declaration of numberText here. Please, include this next time.

// Where you need to call randomNumber()

    answerText.text = randomNumber(guess: numberText.text)

// Note several changes 

func randomNumber (guess: String?) -> String {

    guard let guess = guess, let numGuess = Int(guess) else {
        return "try typing in a number"
    }
    let random = Int(arc4random_uniform(100))
    if numGuess > random {
        return "try a smaller number"
    } else if numGuess < random {
        return "try a larger number"
    } else if numGuess == random {
        return "you got it right, the answer is \(numGuess)!"
    } else {
        return "Try typing numbers from 1-100"
    }
}
//此处是numberText的一些声明。请下次包括这个。
//您需要调用randomNumber()的位置
answerText.text=随机数(猜测:numberText.text)
//注意几个变化
func随机数(猜测:字符串?->字符串{
让guess=guess,让numGuess=Int(guess)else{
返回“尝试键入一个数字”
}
设random=Int(arc4random_均匀(100))
如果numGuess>random{
返回“尝试较小的数字”
}否则,如果numGuess
变化:

  • 您的函数现在接受一个可选字符串,并以字符串形式返回答案。这意味着(1)不在函数中寻址全局UITextfield,使其更具可移植性;(2)函数调用本身不需要进行任何展开
  • 在函数内部立即使用guard语句不仅检查nil,还尝试查看猜测是否确实是一个数字。如果其中任何一个部分失败,它会“轻轻地返回一个字符串,通知用户所做的输入无效
  • 最后,如果它通过
    guard
    语句,则无需进一步展开

如果您对此代码有其他问题,请告诉我-我将进行编辑。

您有大量的
}
缺失或位于错误的位置。AFAICT,只有一个
let strGuess = numberText.text!  // this is an unwrapped staring representing what's in this textfield
let intGuess = Int(strGuess) // this is an Int representation of what was entered
// Some declaration of numberText here. Please, include this next time.

// Where you need to call randomNumber()

    answerText.text = randomNumber(guess: numberText.text)

// Note several changes 

func randomNumber (guess: String?) -> String {

    guard let guess = guess, let numGuess = Int(guess) else {
        return "try typing in a number"
    }
    let random = Int(arc4random_uniform(100))
    if numGuess > random {
        return "try a smaller number"
    } else if numGuess < random {
        return "try a larger number"
    } else if numGuess == random {
        return "you got it right, the answer is \(numGuess)!"
    } else {
        return "Try typing numbers from 1-100"
    }
}