2015-03-02 26 views
1

我認爲很多這樣的帖子,嘗試了幾件事情,但我無法得到錯誤的原因,我也無法解決它。錯誤:意外地發現零,同時展開一個可選值。如何解決它?

我有一個自定義的類。

class Profile: NSObject { 
    var PlayerID: Int? = 0 
    } 

我有對象的AppDelegate,此類

var profile: Profile! 

在其他一些類,我使用

if let playerID = appDelegate.profile.PlayerID { 

} 

它給出錯誤

致命錯誤:意外發現零,同時展開一個可選值

這個錯誤的原因是什麼。 如何解決它。

我試過

if let playerID = appDelegate.profile.PlayerID as? Int { 

} 

也是我試圖

if let playerID = appDelegate.profile.PlayerID as Int! { 

    } 

感謝。

+0

如何在代碼中聲明'appDelegate'? – 2015-03-02 13:29:03

+0

var appDelegate:AppDelegate! – 2015-03-02 13:29:26

回答

2

可能在3分,如果profile是零

  • 如果playerID是零發生在你的代碼此錯誤

    1. 如果appDelegate是零

    嘗試:

    if let playerID = appDelegate?.profile?.PlayerID { 
    
    } 
    

    您可能需要迅速瞭解更多關於自選和optional chaining

  • +0

    AppDelegate在ViewDidLoad中初始化 self.appDelegate = UIApplication.sharedApplication()。委託爲AppDelegate – 2015-03-02 13:32:50

    +0

    什麼是關係! ?和。?並作爲? ,你可以通過編輯你的答案來描述它。這對我來說很容易理解。你爲什麼使用?之前的例子。 – 2015-03-02 13:33:56

    5

    的問題是你的:

    var profile: Profile! 
    

    我假設曲線實際上是nil當你調用這一行:

    if let playerID = appDelegate.profile.PlayerID { 
    
    } 
    

    使用!運算符會強制展開對象,如果對象爲012,則會導致運行時錯誤訪問時爲。

    爲了安全起見,你應該改變你的配置文件屬性在AppDelegate到:

    var profile: Profile? 
    

    ,然後使用可選的鏈接在解開的對象,如果它存在:

    if let playerID = appDelegate.profile?.PlayerID { 
    
    } 
    

    如果配置文件對象存在於AppDelegate中,這將返回PlayerID,否則將返回nil並且代碼塊將不會執行。您需要確保您將profile分配到AppDelegate以及某些時候。

    它總體上是好的做法使用隱含屬性展開,除非你可以絕對保證它不會是零。 (在大多數情況下,這是不太可能的)

    我希望這有助於。

    +0

    很好的解釋... !!!! – Kampai 2015-03-03 06:46:38

    相關問題