当前位置: 首页 > 面试题库 >

类Y的对象X在Swift中未实现methodSignatureForSelector

包唯
2023-03-14
问题内容

我有一个类Person被多次实例化。每个人都有自己的计时器。当我在initPerson我打电话startTimer()

class Person {
 var timer = NSTimer()
 func startTimer() {
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("timerTick"), userInfo: nil, repeats: true)
 }

 func timerTick() {
    angerLevel++
    println("Angry! \(angerLevel)")
 }
...
...
}

因此,我可能在的数组中有3个Person实例Person[]。我收到一个错误:

2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class '_TtC11ThisProgram6Person' does not implement methodSignatureForSelector: -- trouble ahead

我在其他地方读过我应该继承的东西,NSObject但这是在Swift中而不是Obj-C中。该函数在该类中,因此我不确定该怎么做。


问题答案:

不要将其NSObject视为Objective-
C类,而应将其视为可可/基础类。即使您使用Swift而不是Objective-C,您仍在使用所有相同的框架。

有两种选择:(1)将dynamic属性添加到要作为选择器引用的函数中:

    dynamic func timerTick() {
        self.angerLevel++
        print("Angry! \(self.angerLevel)")
    }

或(2)声明Person为的子类NSObject,然后只需super.init()在初始化程序的开头进行调用:

class Person: NSObject {
    var timer = NSTimer()
    var angerLevel = 0

    func startTimer() {
        print("starting timer")
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "timerTick", userInfo: nil, repeats: true)
    }

    func timerTick() {
        self.angerLevel++
        print("Angry! \(self.angerLevel)")
    }

    override init() {
        super.init()
        self.startTimer()
    }
}


 类似资料:
  • 我有个Z接口。它是由Y类实现的。我有另一个继承类Y的类x。因为y实现了类z指定的契约,所以x做同样的事情,因为它扩展了类y。因此,它是否也应该实现接口Z?

  • 问题内容: 当试图理解一个程序时,或者在某些极端情况下,能够真正找出某种类型的东西很有用。我知道调试器可以向您显示一些类型信息,并且您通常可以依靠类型推断来避免在那种情况下不指定类型,但是我仍然很想拥有类似Python的东西 更新: 在Swift的最新版本中对此进行了更改,现在为您提供了对类型的引用,而不是动态类型的实例。 这似乎是最有前途的,但到目前为止我还无法找出实际的类型 我还尝试使用类引用

  • 问题内容: 之间有什么区别: 至: ? 我会更喜欢使用带式号码?还是我必须始终将shell与method 一起使用? 问题答案: 是Java(以及许多其他语言)中按位异或(XOR)运算符。它不用于求幂。为此,您必须使用。

  • 问题内容: 使用math.pow或**运算符哪个更有效?我什么时候应该使用另一个? 到目前为止,我知道可以返回一个或一个,如果您使用小数,该函数将返回一个浮点数 问题答案: 使用Power运算符将更快,因为它不会产生函数调用的开销。如果您反汇编Python代码,则可以看到以下内容: 请注意,我在这里使用变量作为指数,因为类似常数的表达式实际上是在编译时求值的。 现在,实际上,这种差异并不重要,正如

  • X|Y

    描述 (Description) 逻辑运算符[X|Y]匹配X或Y. 例子 (Example) 以下示例显示了逻辑运算符的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class LogicalOperatorDemo { private sta

  • 这是我的完整代码,我已经做了重命名之类的事情,但它仍然没有检测到我的对象“atm”。我总是得到这个错误。 C:\Users\USER\Documents\JCreator LE\MyProjects\oreo\src\oreo。java:30:错误:找不到符号系统。出来println(“\n您的储蓄余额现在是:“atm.gbalance”\n”);