如何将变量中的可选值保存到另一个非可选对象

时间:2017-10-09 09:32:09

标签: ios swift optional

var ret: ServiceQuestion?

    ret = currentQuestion

    return ret ?? ServiceQuestion()

当我像上面一样使用它时工作正常,但当我将代码更改为

var ret = ServiceQuestion()

    ret = currentQuestion

    return ret 

然后它开始给出当前问题变量可选类型的值' ServiceQuestion?'没有打开;

我需要实现第二种方式如何摆脱这个问题

控制台上出现

错误 Cityworks [8230:187999] [错误]错误:CoreData:错误:无法在NSManagedObject类上调用指定的初始化程序' ServiceRequestQuestion' enter image description here

5 个答案:

答案 0 :(得分:0)

您无法在非可选变量中保存可选值。

你必须打开它。

有很多方法可以做到这一点。

最简单(也是最危险的)是...... ret = currentQuestion!

但如果currentQuestion为零,则会崩溃。您必须决定如何打开它。

答案 1 :(得分:0)

由于ret不再是可选的,您可以在??运算符中使用其值:

var ret = ServiceQuestion()
ret = currentQuestion ?? ret

但是,当ServiceQuestion具有值时,这将分配currentQuestion未使用的内容,因此您的第一个代码段效率更高。它也更容易理解。

答案 2 :(得分:0)

您可以使用强行展开

return currentQuestion!

...但是不应该使用强制展开,只有在绝对确定价值永远不会是nil的情况下,才会在非常狭窄和专注的情况下使用。

为什么呢?因为如果值为nil您的应用程序将崩溃。考虑更改返回值为可选

答案 3 :(得分:0)

您可以这样使用它: -

var serviceQuestion = ServiceQuestion()
if let currentQuestion:ServiceQuestion = currentQuestion {
    serviceQuestion = currentQuestion 
}
return serviceQuestion

答案 4 :(得分:0)

var ret = ServiceQuestion()
    ret = currentQuestion
       return ret

您收到此错误,因为ret是非可选变量,但currentQuestion是可选的,您将可选变量分配给非可选变量。

你需要做

var serviceQuestion = ServiceQuestion()
if let currentQuestion = currentQuestion {
    serviceQuestion = currentQuestion 
}
return serviceQuestion

var serviceQuestion = ServiceQuestion()
if currentQuestion != nil {
    serviceQuestion = currentQuestion!
}
return serviceQuestion

如果你这样做

var serviceQuestion = ServiceQuestion()
serviceQuestion = currentQuestion! 
return serviceQuestion

当currentQuestion为nil时可能会崩溃