2017-10-09 49 views
-2
var ret: ServiceQuestion? 

    ret = currentQuestion 

    return ret ?? ServiceQuestion() 

當我使用它像上面它工作正常,但是當我更改代碼以如何在一個變量保存一個可選的值,另一個非可選的對象

var ret = ServiceQuestion() 

    ret = currentQuestion 

    return ret 

然後開始對給錯誤當前問題變量可選類型'ServiceQuestion?'的值不打開;

我需要實現的第二個辦法,我怎樣才能擺脫這個問題

控制檯上 錯誤的Cityworks [8230:187999] [錯誤]錯誤:CoreData:錯誤:未能呼籲NSManagedObject指定的初始化class'ServiceRequestQuestion' enter image description here

回答

0

您無法將可選值保存到非可選var中。

你必須打開它。

有很多方法可以做到這一點。

最簡單的(也是最危險的)是... ret = currentQuestion!

但是如果currentQuestion爲零,這會崩潰。你必須決定你想如何解開它。

0

由於ret不再是可有可無的,你可以用它的價值在??操作:

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

然而,這將分配ServiceQuestion,將保持不使用時currentQuestion具有價值,那麼你的第一個代碼片段更有效。這也更容易理解。

0

可以使用力此展開

return currentQuestion! 

...但你不應該使用武力展開,只有在真正的狹窄和專用的情況下,當你有絕對把握的價值永遠不會是nil

爲什麼?因爲如果值爲nil,您的應用程序將崩潰。考慮更改返回值到可選

0

你可以使用它像: -

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

線程1就可能會崩潰:EXC_BAD_ACCESS(代碼= 1,地址= 0x70)給這個錯誤要麼 。 –

+0

您確定您的初始化程序是正確的,因爲這是內存分配錯誤的編譯器錯誤,請問您是否可以在控制檯上共享完整的函數源和錯誤代碼 –

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爲零

+0

線程1:EXC_BAD_ACCESS(code = 1,address = 0x70) serviceQuestion = currentQuestion錯誤 –

相關問題