Ios 如何知道Swift中的文本字段是否为空?

Ios 如何知道Swift中的文本字段是否为空?,ios,swift,Ios,Swift,我正在swift中创建一个基础应用程序(用于学习目的),以便将猫年转换为人类年。因此,有一个名为:edadGatoTextField的文本框,用户可以在其中输入猫的年份,然后按calcularEdadButtonPressed按钮查看在mensajeLabel中转换的年份 我试图添加一个if语句,以便在mensajeLabel中打印一条消息,告诉用户必须输入一个数字才能转换它 -->下面是代码,它应该可以工作,但是为什么我在:if age? self.yourTextField.add

我正在swift中创建一个基础应用程序(用于学习目的),以便将猫年转换为人类年。因此,有一个名为:edadGatoTextField的文本框,用户可以在其中输入猫的年份,然后按calcularEdadButtonPressed按钮查看在mensajeLabel中转换的年份

我试图添加一个if语句,以便在mensajeLabel中打印一条消息,告诉用户必须输入一个数字才能转换它

-->下面是代码,它应该可以工作,但是为什么我在:if age?

     self.yourTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
我正常运行我的应用程序,但当按下CalcularedDataButton按钮时,当edadGatoTextField中没有数字时,应用程序崩溃

有一些东西与期权或未包装的期权有关

class ViewController: UIViewController {

    @IBOutlet weak var edadGatoTextField: UITextField!
    @IBOutlet weak var mensajeLabel: UILabel!
    @IBOutlet weak var imagenGatoImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func calcularEdadButtonPressed(sender: AnyObject) {

        var age = edadGatoTextField.text.toInt()

        // *** Bellow is the error! I'm trying to figure out if user
        // has not entered any number in order to display the message.

        if age { 

            age = age * 7

            mensajeLabel.text = "Your cat's age is \(age) years!"
            mensajeLabel.textColor = UIColor.blueColor()

            edadGatoTextField.resignFirstResponder()

            imagenGatoImageView.image = UIImage(named: "cat2.jpg")

        } else {

            mensajeLabel.text = "Please enter a number!"
            mensajeLabel.textColor = UIColor.redColor()

        }

    }

}

age
的类型为
Int?
(可选的
Int
),因此是整数或
nil
。不能将
nil
比较视为Swift
if
语句中的布尔比较。必须明确检查
nil

if age != nil {
    let humanAge = age! * 7
    //...
} else {
    //...
}
但您可能应该改用可选绑定,除非您有理由不:

if let age = edadGatoTextField.text.toInt() {
    let humanAge = age * 7
    //...
} else {
    //...
}

如果查看docs UITextField.text,它是一个隐式展开的可选项,因此如果未初始化,它可能为零。由于“if let”和可选的链接构造,当且仅当文本不是nil并且可转换为int时,您将获得“age”,否则它将为nil

这里有两个问题

首先,
UITextField
text
属性是可选的。除非每次创建时都手动将其设置为空字符串,否则在用户键入内容之前,它将为
nil

其次,
String
toInt()
方法返回可选的
Int?
。如果调用的
toInt()
字符串不能被解析为整数,
toInt()
返回
nil

还有斯图尔特的答案遇到的障碍。使用
if-let
模式,我们必须在
if
主体内声明另一个变量乘以7,因为
if-let
声明了一个不能修改的常量

然而,我们可以在一条线上解决所有这三个问题。我们只需要知道,
if let
不是唯一可用的模式。如果var,我们可以使用

if var catAge = edadGatoTextField.text.toInt() {
    catAge *= 7
    // the rest of what you need to do
}

Swift 3

您可以通过此代码检查文本字段是否为空?

将目标添加到文本字段中

     self.yourTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
现在,您可以绑定与目标字段关联的函数。


如果是年龄!=nil{}将在第age=age*7行给出错误。我认为最好的方法是在您的答案中添加代码片段。
如果让age=edadGatoTextField.text.toInt()
也会在
age=age*7
行给出错误,因为
age
将是一个常量。我假设他们自己能够重构
if
语句的内容,但我将编辑我的答案以澄清。@Stuart我尝试了这两种方法,它们都很好地工作。感谢您的精彩解释。我甚至不知道
if var
statement@nhgrif很好,我也不知道您可以在可选绑定中使用
var
(我知道这在函数声明中是可能的,但我不记得文档中提到过
if
)。一个小建议:您正在使用类似CalcularedAbuttonPressed()的方法名。选择一种语言并坚持使用它,而不是将它们混合使用,这可能是有用的。所以calculateAgeButtonPressed()。如果你把它们结合起来,你一定会在某个时候感到困惑。就个人而言,我只喜欢使用英语,因为编程语言本身也是英语(.text、.textColor等),堆栈溢出上的每个人在粘贴示例代码时都能够阅读和理解名称。关于@nhgrif answer,使用var而不是let可以节省时间,编码可以创建另一个变量来计算cat年数。不要在问题中编辑答案。只要将一个标记为已接受。@StevensGarcia使用
如果var
不仅节省了编码时间和代码行,而且效率更高,因为我们只在堆栈上创建一个变量,而不是两个,并且我们只将内存从位置a移动到位置b一次,而不是两次。
func textFieldDidChange(textField: UITextField){
      if textField.text == "" {
           //You can perfrom your activity here when textfield got blank or empty
      }
      else
      {
           //You can perfrom your activity here when textfield got not blank or not empty 
      }

 }