展开回调函数swift上的可选值

展开回调函数swift上的可选值,swift,callback,optional,Swift,Callback,Optional,我提出这个问题是因为即使有多个类似的标题,我也无法找到一个与我有相同的问题。我有一个函数,它调用一个有回调的函数。第二个函数对另一个具有回调的函数进行另一次调用。我的问题是,被调用的第三个函数在一个.m文件中,我可以通过桥访问它。如果没有错误,此函数将返回nil。问题是我无法在回调函数中允许nil,它返回错误: 致命错误:在展开可选值时意外发现nil 我是swift的新手,从我所读到的来看,使用optionals是一种很好的方法,但它仍然会带来问题。有什么想法吗 代码: mainViewCont

我提出这个问题是因为即使有多个类似的标题,我也无法找到一个与我有相同的问题。我有一个函数,它调用一个有回调的函数。第二个函数对另一个具有回调的函数进行另一次调用。我的问题是,被调用的第三个函数在一个.m文件中,我可以通过桥访问它。如果没有错误,此函数将返回nil。问题是我无法在回调函数中允许nil,它返回错误:


致命错误:在展开可选值时意外发现nil

我是swift的新手,从我所读到的来看,使用optionals是一种很好的方法,但它仍然会带来问题。有什么想法吗

代码:

mainViewController.swift

func makeACall(){
   var service:Service!
   service = Service()

   // error happens on this next line I believe is the error variable
   service.lookup(item: itemTextField.text, callback: { (details:String?, error: serviceError?) -> Void in

   if (error != nil){
    //do something
   }

   })
}
斯威夫特

func lookup(item:String!, callback: (_ details:String?, _ error: serviceError?) -> Void){

super.fetchItem(item, callback: { (details:String?, error: serviceError?) -> Void in 
     callback(details, error!)

 }) // in objective C .m file fetchItem returns the call back as callback(details, nil) if no error

}

如果你的回调函数有一个可选的,为什么你要强制展开它

你不知道细节

这两个选项都是可选的,但是您强制展开错误选项。使用如下回调函数:

callback(details, error)
至于要输入的文本。只需在获取之前执行以下操作:

guard let itemText = itemTextField.text else { return }
或者,如果你想调用一个空字符串的函数,你也可以这样做

let itemText = itemTextField.text ?? ""
然后使用itemText,如下所示:

service.lookup(item: itemText, callback: { (details:String?, error: serviceError?) -> Void in
     if (error != nil){
     //do something
     }
})

谢谢你或你的帮助!我尝试了您建议的方法,但不幸的是错误仍然发生,也发生在服务func上,您是否建议添加func lookupitem:String!,回调:在函数行上转义关键字?致命错误:在展开可选值时意外发现nil-此错误表示值为nil,您使用了bang!打开它。尽量避开它们。我也不明白你为什么声明你的var服务:service!就像你那样。为什么不直接初始化它呢?是,如果您使用的是swift 3,请明确添加@escaping。我只是假设你没有,因为你的代码没有。编辑:请澄清-如果停止使用刘海,则不会发生崩溃!。