2016-07-14 52 views
-1

如果我聲明,並在類的頂部設置一個變量,像對象是零隻在字典

class Test { 
    var timer = NSTimer() 
    ... 

,後來在一個函數來測試它的有效性,如if timer.valid {...},沒有問題。但如果我把它放在一個字典

var timers = ["first": NSTimer(), ...] 

和測試與if timers["first"]!.valid {...},我得到一個「意外發現無」在運行時的致命錯誤。爲什麼這些行爲有所不同,以及如何讓字典不要拋出定時器初始化?如果這是重複的,請指出,我只是不知道要搜索什麼。字典文檔沒有任何亮點,我還沒有嘗試過除NSTimer之外的任何內容。

+0

感謝您的反饋,downvoter – mjr

回答

5

這是Foundation中的一個錯誤,您應該打開一個缺陷。 NSTimer()不是有效的初始化程序,它應該被標記爲不可用。順便提一下,NSError也會出現類似的情況。 Swift可以讓你用NSError()構造它們,即使它們無效並會在你嘗試使用它們時崩潰。

事實上,你碰巧得到它,它可能由於無信息(這是ObjC如何工作)返回「假」,不應該被視爲「它應該工作」。 NSTimer()是無效的代碼。

1

大約從init()初始化的NSObject文檔:

子類實現初始化一個新的對象(接收器) 內存後,立即對已分配的。

後來:

的對象是不是就可以使用了,直到它已被初始化。

根據NSTimer文檔,init()未列爲創建計時器的有效初始值設定項。

1

與int,string和其他數據類型不同,它們通過在int()或String()中進行初始化。你不能簡單地做NSTimer()。當你試圖這樣做時,它會崩潰,所以你總是得到零。如果你想要一個定時器,試試

NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval, target: AnyObject, selector: Selector, userInfo: AnyObject?, repeats: Bool) 

只需填寫時間間隔,目標,選擇器,用戶信息和重複。

+1

我認爲你有它倒退:你總是得到一個零,因此它崩潰,當你試圖做到這一點 – Alexander