我是Swift的新手并编写了一个从扫描仪读取数据然后将其发布到网页的应用程序。我现在从主要故事板上的文本编辑字段中获取数据,当我按下查找按钮以触发以下代码时,它会抛出以下异常。我设置了一个断点并在URL中使用之前检查了temp的值,并正确地着色(不是nil)。如果我输入编辑字段,那么从那时起代码工作正常;即使我使用清除图标(x)删除编辑字段的内容,也会打开页面。
我无法理解哪个变量是零,以及如何纠正或保护代码。任何帮助将不胜感激。
线程1:致命错误:在解包可选值时意外发现nil
func setStatus(_ status: String)
{
statusLabel.text = status
}
func processRead(_ data: String?)
{
if (data != nil)
{
var temp: String = data!
setStatus(temp)
temp = "foo.com?data=" + temp
let url: URL = URL(string: temp)! // <<<< THROWS EXCEPTION / BREAK POINT
UIApplication.shared.openURL(url)
}
}
更新 - 更正代码 -
func setStatus(_ status: String)
{
statusLabel.text = status
}
func processRead(_ data: String?)
{
if (data != nil && !data!.isEmpty)
{
let temp = "https://foo.com/data=" + data!.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!);
if let url = URL(string: temp)
{
setStatus(data!)
UIApplication.shared.openURL(url)
}
else
{
print("Bad URL: " + temp);
}
}
}
答案 0 :(得分:2)
temp
可能包含一些在URL的查询部分无效的字符。这使得整个字符串不是有效的URL,因此URL.init
返回nil。您需要通过调用addingPercentEncoding
来转义这些字符:
URL(string: "foo.com?data=" + temp.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!)
答案 1 :(得分:0)
当使用临时字符串初始化URL
对象时,它无法将字符串成功转换为URL。由于URL初始值设定项init?(string: String)
是可选的初始值设定项,因此如果将sting转换为URL时出错,则可以返回nil。尝试在字符串中添加“https://”。
temp = "https://foo.com?data=" + temp