如果我在类的顶部声明并设置一个变量,比如
class Test {
var timer = NSTimer()
...
并稍后在函数中测试其有效性,如if timer.valid {...}
,没问题。但如果我把它放在字典中
var timers = ["first": NSTimer(), ...]
并使用if timers["first"]!.valid {...}
对其进行测试,我得到一个"意外发现的nil"运行时致命错误。为什么这些行为不同,如何让字典不要丢弃我的计时器初始化?如果这是重复,请指出,我只是不知道要搜索什么。字典文档没有任何亮点,除了NSTimer
之外,我还没有尝试过它。
答案 0 :(得分:5)
这是Foundation中的一个错误,您应该打开一个缺陷。 NSTimer()
不是有效的初始化程序,应将其标记为不可用。顺便提一下NSError
也会发生类似的事情。 Swift允许您使用NSError()
构造它们,即使它们无效,如果您尝试使用它们也会崩溃。
事实上,你碰巧侥幸逃脱,而且由于零消息(这就是ObjC的工作方式),它可能会返回“假”,不应该被视为“它应该工作”。 NSTimer()
是无效的代码。
答案 1 :(得分:1)
关于NSObject
初始值设定项的init()
文档:
由子类实现以初始化新对象(接收者) 在分配了内存之后立即。
随后:
在初始化对象之前,对象尚未准备好使用。
根据NSTimer
文档,init()
未列为创建计时器的有效初始化程序。
答案 2 :(得分:1)
与int,string和其他数据类型不同,在初始化时通过说int()或String()。你不能简单地做NSTimer()。当你试图这样做时它崩溃了,所以你总是得到一个零。如果你想要一个计时器,试试
NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval, target: AnyObject, selector: Selector, userInfo: AnyObject?, repeats: Bool)
只需填写时间间隔,目标,选择器,用户信息和重复。