检查长度时Swift执行错误

时间:2014-06-17 21:00:15

标签: swift

我正在尝试评估表单字段的内容,当为空时抛出错误。

这是出口代码

@IBOutlet var txtUsername : UITextField!

这是目标字段的println。

println("\(txtUsername)")

<UITextField: 0x10e8280a0; frame = (20 40; 280 30); text = ''; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x10e828b20>; layer = <CALayer: 0x10e828300>>

所以,看看这个我会假设txtUsername.text为空或==&#34;&#34;。但我尝试做的每件事都会引发错误。

if countElements(txtUsername.text as String) != 0 {
    ... code here
}

if txtUsername.text.bridgeToObjectiveC().length != 0 {
  ... code here
}

if txtUsername.text.utf16count != 0 {
   ... code here
}

if txtUsername.text != "" {
  ... code here
}

全部带回&#34; EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

另外,评估它是否为零似乎不起作用。以下脚本显示有待评估的内容,即使它是空白的。问题在于告诉它是否为空白。

如果字段为nil,我希望它返回false并触发else语句。

if let evalText = txtUsername.text{
       println("There is something here : \(evalText)")

    } else {
        println("text is nil")
    }

// This returns "There is something here:"

if txtUsername.text{
       println("There is something here")

    } else {
        println("text is nil")
    }
// This returns "There is something here"

我甚至试图在变量中设置值,只是在点击&#34之后让它发出错误;如果&#34;言。

谢谢,

3 个答案:

答案 0 :(得分:0)

EXC_BAD_INSTRUCTION意味着断言失败。当某些内容为nil时,这种情况最常见,但您仍在尝试对其进行操作。

text的{​​{1}}属性为Implicitly Unwrapped OptionalUITextField)。您必须先检查它是否为String!。您的应用正在崩溃,因为它是nil

答案 1 :(得分:0)

txtUsername.text在Swift中是可选的。即使您的标签是可选的,因此在声明时使用!并不安全。但无论如何,尝试使用这个:

if let currentText = txtUsername.text {
    // ... Do something with currentText ...
}
else {
    NSLog("Text is nil")
}

要确保您甚至可以检查txtUsername是否以相同的方式设置。所以最后你会得到这个:

if let currentTxtUsername = txtUsername{
    if let currentText = currentTxtUsername.text {
        // ... Do something with currentText ...
    }
    else {
        NSLog("Text is nil")
    }
}
else {
    NSLog("Text label is nil")
}

不要忘记删除声明部分中的!

答案 2 :(得分:0)

原来是错误重影问题。

实际问题是它会在代码中进一步下降并遇到一种情况,即我无意中试图将核心数据对象中的nil数据放回文本字符串中。将文本字段设置为nil不起作用,而不是在出现问题的地方出错,而是在&#34; if&#34;声明在其上方20行。

以下是完整代码,以及该问题的一些描述。

    @IBAction func btnLoad(sender : AnyObject) {

    var appDel = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context = appDel.managedObjectContext
    var request = NSFetchRequest(entityName: "Users")
    request.returnsObjectsAsFaults = false


    // Here is the place where it throws the error.
    if txtUsername.text == "" {
       request.predicate = NSPredicate(format: "username = %@", "\(txtUsername.text)")
    }


    var results = context.executeFetchRequest(request, error: nil)

    println(results)

    if(results.count > 0){

        var res = results[0] as NSManagedObject

        println("\(res)")

        //*** The database had nil values for the result selected.  And nil doesn't go into a text field.
        txtUsername.text = res.valueForKey("username") as String
        txtPassword.text = res.valueForKey("password") as String

        responseLabel("User Found")

    } else {
        responseLabel("No Users Found")
    }

}

感谢大家的回复。