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

Ios 如何将变量中的可选值保存到另一个非可选对象,ios,swift,optional,Ios,Swift,Optional,当我像上面那样使用它时,它工作得很好,但是当我将代码更改为 var ret: ServiceQuestion? ret = currentQuestion return ret ?? ServiceQuestion() 然后,它开始对当前问题变量的可选类型“ServiceQuestion?”的值给出错误,该值未展开 我需要实施第二种方法如何解决这个问题 控制台上的错误 Cityworks[8230:187999][error]错误:CoreData:错误:未能调用NSMan

当我像上面那样使用它时,它工作得很好,但是当我将代码更改为

var ret: ServiceQuestion?

    ret = currentQuestion

    return ret ?? ServiceQuestion()
然后,它开始对当前问题变量的可选类型“ServiceQuestion?”的值给出错误,该值未展开

我需要实施第二种方法如何解决这个问题

控制台上的错误 Cityworks[8230:187999][error]错误:CoreData:错误:未能调用NSManagedObject类“ServiceRequestQuestion”上的指定初始值设定项

您不能在非可选变量中保存可选值

你得把它打开

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

最简单的(也是最危险的)是<代码>返回=当前问题


但如果
currentQuestion
为零,则此操作将崩溃。您必须决定如何展开它。

由于
ret
不再是可选的,您可以在
??
操作符中使用它的值:

var ret = ServiceQuestion()

    ret = currentQuestion

    return ret 

但是,这将分配
ServiceQuestion
,当
currentQuestion
有值时,这些问题将保持未使用状态,因此您的第一个代码段更有效。这也更容易理解。

您可以使用强制展开来实现以下目的:

var ret = ServiceQuestion()
ret = currentQuestion ?? ret
…但是不应使用强制展开,只有在非常狭窄和专用的情况下,当您绝对确定值永远不会为
nil


为什么??因为如果值为
nil
您的应用程序将崩溃。考虑<强>更改< /强>返回值<强>为可选< /强> ./p> < p>可以使用如下:-< /p>
return currentQuestion!
出现此错误是因为ret是非可选变量,但currentQuestion是可选的,并且您正在将可选变量分配给非可选变量

你需要做什么

var ret = ServiceQuestion()
    ret = currentQuestion
       return ret

如果你这样做

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

当currentQuestion为nil时,线程1:EXC_BAD_ACCESS(代码=1,地址=0x70)出现此错误,它可能会崩溃。您确定您的初始化器是正确的,因为这是由于编译器错误导致内存分配错误,您能否在控制台上共享函数和错误的完整源读取1:EXC_BAD_ACCESS(代码=1,地址=0x70)在serviceQuestion=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