Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何验证IBOutlet/var是否为零?_Iphone_Xcode_Swift_Ios8 - Fatal编程技术网

Iphone 如何验证IBOutlet/var是否为零?

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:

我使用Swift和Xcode 6.1.1编写了一个简单的应用程序。该程序是一个简单的计算器,运行良好,但我无法验证三个文本字段的非零输入。因此,如果用户将字段留空,然后点击“计算”,应用程序就会崩溃

该应用程序接受三个输入,最初为字符串。我写了一个if语句来检查nil,但它不起作用——不管怎样,它都会传递给else。以下是与我的问题相关的代码块:

...
@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 {

 }