【问题标题】:fatal error: unexpectedly found nil while unwrapping an Optional value (cannot force unwrap value of non-optional type 'String')致命错误:解包可选值时意外发现 nil(无法强制解包非可选类型“字符串”的值)
【发布时间】:2016-04-22 09:54:49
【问题描述】:

我正在尝试将预先附加的字符串作为 URL 请求传递,但我不断收到错误消息:fatal error: unexpectedly found nil while unwrapping an Optional value

此错误指向以下行:let searchTerm = "http://google.com/#q="+textField.text!

ViewController.swift

func textFieldDidUpdate(textField: UITextField) {

    if (textField.text!.rangeOfCharacterFromSet(NSCharacterSet.whitespaceCharacterSet()) != nil) {
        self.webView.hidden = false
        let searchTerm = "http://google.com/#q="+textField.text!
        let request = NSURLRequest(URL: NSURL(string: searchTerm)!)
        self.webView.loadRequest(request)
    }
}

【问题讨论】:

    标签: ios string swift


    【解决方案1】:

    您应该将方法参数名称更改为func textFieldDidUpdate(sender: UITextField),使用保护来解开您的可选文本字段文本属性,并使用查询允许的字符集向您的字符串添加百分比转义。

    func textFieldDidUpdate(sender: UITextField) {
        guard
            let text = sender.text,
            query = text.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet()),
            url = NSURL(string: "https://google.com/#q=\(query)")
        else { return }
        webView.hidden = false
        webView.loadRequest(NSURLRequest(URL: url))
    }
    

    【讨论】:

    • 完美运行,谢谢。 :) 只是出于好奇,在这种情况下,guard 参数有什么作用?
    • 它确实确保 sender text 属性不是 nil,如果是,它会解开它,然后它会确保附加文本的结果不是 nil,如果是,它会再次解开它。与在该字符串中插值的查询结果相同的 url。如果这 3 行中的任何一行失败,它就会返回。
    • 你介意看看我的GitHub project吗?看来我现在已经使用这种方法禁用了基本的 URL 检测。输入诸如http://apple.caapple.ca 之类的术语不再起作用。 :(
    • 尝试使用主机允许的字符集
    • 这不是我无法检测到不同之处,而是一旦从func textFieldDidUpdate(textField: UITextField) 切换到func textFieldDidUpdate(sender: UITextField),无论如何它只是Google 的URL。 编辑: 像这些简单的事情总是让我很头疼。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多