【问题标题】:Difference between #selector(Aclass.method) and #selector(self.method) [duplicate]#selector(Aclass.method)和#selector(self.method)之间的区别[重复]
【发布时间】:2016-04-07 20:18:08
【问题描述】:

有什么区别:

#selector(Aclass.someMethod)#selector(self.someMethod)

someMethod 是一个实例函数,我在 AClass 内部调用如下:

NSNotificationCenter.defaultCenter().addObserver(self, 
  selector: #selector(self.someMethod), // #selector(Aclass.method)
  name: "REMoveOrderViewRefresh", 
  object: nil
)

【问题讨论】:

  • proposal for #selector 从未提及 self.method 语法,所以我想知道它是否只是偶然起作用。
  • @dfri 很好的发现,不知道! (没有投票,如果尚未关闭,将在 UTC 午夜 12 点返回)

标签: ios swift selector


【解决方案1】:

如果您从自己的类中引用选择器,则应该没有区别,因为 self 指向 Aclass

如果您从另一个类中引用选择器,则必须显式调用 Aclass.someMethod,因为选择器不在 self 上,而是在不同的对象上。

class MyClass: NSObject {
    func someFunc() {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.someOtherFunc(_:)), name: "someEvent", object: nil)
    }

    func someOtherFunc(notification: AnyObject) {
        //
    }
}

class OtherClass: NSObject {

    func anotherFunc() {
        let myInstance = MyClass()

        NSNotificationCenter.defaultCenter().addObserver(myInstance, selector: #selector(MyClass.someOtherFunc(_:)), name: "someEvent", object: nil)
    }
}

【讨论】:

  • 我在这里很可能是错的,但是在类上调用 self 会返回类名,但是在实例化对象上调用 self 会返回该特定实例,不是吗?那么基于那个 self.someMethod 就行不通了?
  • @Scriptable 除非我弄错了#selector(MyClass.someOtherFunc(_:)) 指向类实例上的特定方法。选择器只需要显式定义为类的方法。如果这是错误的,我很乐意退后一步,让专业人士回答。
  • 这只是我的理解.. 希望专业人士能指出我正确的方向哈哈。我现在很好奇,我得试试看
  • @Darko:与类与实例方法的一般规则相比,Swift #selector 语法有点特殊(和奇特)。编译器会将 实例方法 someMethod#selector(Aclass.someMethod) 解析为Aclass 的实例。见matt:s Q&A for details
  • @Darko:你说得对,解析实例自然需要目标。但是,如果您在 within Aclass,并且想要将选择器添加到方法 (objc) in Aclass,则可以使用 #selector(self.someMethod),就像还有#selector(Aclass.someMethod)
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 2011-09-23
  • 2017-06-09
  • 2011-09-30
  • 2011-11-18
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多