Iphone 如何验证IBOutlet/var是否为零?
我使用Swift和Xcode 6.1.1编写了一个简单的应用程序。该程序是一个简单的计算器,运行良好,但我无法验证三个文本字段的非零输入。因此,如果用户将字段留空,然后点击“计算”,应用程序就会崩溃 该应用程序接受三个输入,最初为字符串。我写了一个if语句来检查nil,但它不起作用——不管怎样,它都会传递给else。以下是与我的问题相关的代码块:Iphone 如何验证IBOutlet/var是否为零?,iphone,xcode,swift,ios8,Iphone,Xcode,Swift,Ios8,我使用Swift和Xcode 6.1.1编写了一个简单的应用程序。该程序是一个简单的计算器,运行良好,但我无法验证三个文本字段的非零输入。因此,如果用户将字段留空,然后点击“计算”,应用程序就会崩溃 该应用程序接受三个输入,最初为字符串。我写了一个if语句来检查nil,但它不起作用——不管怎样,它都会传递给else。以下是与我的问题相关的代码块: ... @IBOutlet var calcButton: UIBarButtonItem! @IBOutlet var yearOneField:
...
@IBOutlet var calcButton: UIBarButtonItem!
@IBOutlet var yearOneField: UITextField!
@IBOutlet var yearTwoField: UITextField!
@IBOutlet var yearThreeField: UITextField!
@IBOutlet var displayWindow: UILabel!
@IBAction func calcButtonTapped(sender: AnyObject) {
if (yearOneField == nil) {
displayWindow.text = ("Non-zero entries are not permitted. Please enter new values.")
} else {
let yearOne = yearOneField.text.toInt()
let yearTwo = yearTwoField.text.toInt()
let yearThree = yearThreeField.text.toInt()
...
我在想我可以评估IBOutlet为零,但那不起作用。我是Swift和Xcode的新手,所以我希望这是一个n00b问题,请有经验的开发人员回答。谢谢。文本字段本身永远不会是
nil
。它们是在初始化期间创建和分配的,您永远不会删除它们
我想您应该检查它们的文本属性是否包含任何文本,您可以这样做:
为Swift 2更新:
您可以使用guard
避免嵌套:
guard let text = yearOneField.text where !text.isEmpty else {
// the text field is empty
return
}
// perform the conversions
我更喜欢guard
语法,因为它更清楚理想的结果是什么。唯一的方法是@IBOutlet
s可以nil
如果你忘记在Interface Builder中连接它们。通常您不需要检查,因为崩溃会告诉您如何解决该问题
函数返回一个可选的Int
(又称Int?
),在使用之前必须先将其展开<如果文本字段中的值不代表有效的Int
,则code>toInt()将返回nil
。如果使用toInt()
进行转换,“2.1”、“七”和“”都将返回nil
。我建议您使用可选绑定(如果let
)语法来检查nil
的转换,如果结果不是nil
,则将其展开:
if let yearOne = yearOneField.text.toInt() {
if let yearTwo = yearTwoField.text.toInt() {
if let yearThree = yearThreeField.text.toInt() {
// yearOne, yearTwo, and yearThree are all valid Ints
// so do the calculations
}
}
}
或者,如果您知道在无法将字段转换为Int
时要使用默认值(如0
),则可以使用无合并运算符?
展开结果,如下所示:
let yearOne = yearOneField.text.toInt() ?? 0
let yearTwo = yearTwoField.text.toInt() ?? 0
let yearThree = yearThreeField.text.toInt() ?? 0
您可以像使用普通选项一样进行检查
guard let unwrapped = myLabel else {return}
还是像这样
if myLabel == nil {
//do stuff
}
或者像这样:
if let unwrappedLabel = myLabel {
}
谢谢你,亚伦,这正是我需要做的。谢谢@vacawama。我将尝试一下,使我的代码更智能一些。如果在导航离开视图后异步函数返回会怎么样?如果您在完成处理程序中引用了一个IBOutlet,它会是nil吗?@FateNuller,或者您的闭包捕获了self
,在这种情况下,viewController将一直挂起,直到闭包完成并释放指向self
的强指针,或者如果您使用[弱self]
若要将弱指针指向viewController,则当解除分配viewController时,您的self
将设置为nil
,并且您将无法访问@IBOutlets
,因为它们将消失很久。在这两种情况下,您都不必担心插座是nil
。
if let unwrappedLabel = myLabel {
}