对象仅在字典

时间:2016-07-14 15:03:27

标签: swift dictionary

如果我在类的顶部声明并设置一个变量,比如

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

并稍后在函数中测试其有效性,如if timer.valid {...},没问题。但如果我把它放在字典中

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

并使用if timers["first"]!.valid {...}对其进行测试,我得到一个"意外发现的nil"运行时致命错误。为什么这些行为不同,如何让字典不要丢弃我的计时器初始化?如果这是重复,请指出,我只是不知道要搜索什么。字典文档没有任何亮点,除了NSTimer之外,我还没有尝试过它。

3 个答案:

答案 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)

只需填写时间间隔,目标,选择器,用户信息和重复。