2015-03-13 56 views
2

我有一個UITableViewController通過NSFetchedResultsController從核心數據加載條目。就像這樣:Swift:處理意外的零值,當變量不是可選的時

let historyItem = fetchedResults.objectAtIndexPath(indexPath) as HistoryItem 

historyItem有這樣定義的title屬性:

@NSManaged var title: String 

所以在cellForRowAtIndexPath代碼說

cell?.textLabel?.text = historyItem.title 

而且都應該罰款。 title不是可選的,不需要解包。

但是,在過去,存儲的核心數據已經獲得了一些對象,其中title屬性的值是nil。他們在那裏存儲,等待導致錯誤。如果其中一個對象顯示在單元格中,我將在上面的Swift代碼行中看到運行時地址異常,其中地址爲0.

爲了健壯性,我需要編寫代碼以確保存儲的數據已交付到我的程序不會導致崩潰。但是,我不能寫

if historyItem.title == nil { } // gives compiler error 

因爲title不是可選的,編譯器不會讓我。如果我寫

let optionalTitle:String? = historyItem.title 

我仍然在該行上得到運行時EXC_BAD_ACCESS

我怎樣才能檢查title是不是錯誤的零?

謝謝!

+0

我已經關閉作爲重複,因爲我認爲這是同樣的問題。讓我知道如果這些解決方案不適用於你的情況,那麼我會重新提出這個問題。 – 2015-03-13 10:57:36

+0

是的,這是完全相同的情況(我沒有找到我的搜索),但高標記的解決方案無法正常工作。我會問另一個問題指出。謝謝! – emrys57 2015-03-13 11:04:59

+0

我問另一個問題在http://stackoverflow.com/questions/29031080/swift-detecting-an-unexpected-nil-value-in-a-non-optional-at-runtime-casting-a – emrys57 2015-03-13 11:30:37

回答

0

由於您沒有值,因此title屬性應該是可選的,您應該在覈心數據模型和歷史項目類中將其聲明爲可選項。

+0

如果我只是改變標題類型爲String ?,(並且通過代碼更改所有使用標題的位置,將其解包),那麼核心數據代碼會給出運行時錯誤。我可以寫一個移民,也許......但我寧願只是檢查意想不到的價值。 – emrys57 2015-03-13 10:44:08

0

當我這樣做是編輯,我沒有得到一個錯誤,從而可能的答案:

let a = "" 

if a as String? == nil { 
     println("Nil") 
    } 
    else { 
     println("Not nil") 
    } 
+0

看起來很有希望!不幸的是,它不起作用。如果我寫'if historyItem.title as String? == nil {t =「was Nil」}'那麼如果title爲零,我會得到EXC_BAD_ACCESS。 – emrys57 2015-03-13 10:50:19

+0

嘗試'''如果讓historyItemTitle = historyItem.title as? String {「historyItem.title not nil」} else else {「historyItem.tile is nil」}''' – pJes2 2015-03-13 10:56:25

+0

或者,如果您創建了類型標題:String!這將使無比較。 – Arbitur 2015-03-13 11:19:44

0

@NSManaged var title: String應該是@NSManaged var title: String?如果有一個零值的可能性。然後,你可以用可選的綁定錯誤:

if let historyItemTitle = historyItem.title { 
    cell?.textLabel?.text = historyItemTitle 
} else { 
    cell?.textLabel?.text = "Title missing" 
} 
相關問題