假设我们处于SomeClass的实例中,请考虑以下简单调用
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: #selector(SomeClass.fixer(_:)),
name:"FixerNote",
object:nil)
假设我们决定对扩展名进行保存以保存输入内容,结果将如下所示:
"FixerNote".does( #selector(SomeClass.fixer(_:)) )
这是扩展名...
public extension String
{
func does(s:Selector)
{
NSNotificationCenter.defaultCenter().addObserver
.. here, you need the actual SomeClass that called us .. ,
selector: s,
name:self,
object:nil)
}
}
如何知道哪个对象称为扩展名?
(注意,我知道您可以将其传递或用作基础:))
你可以在Swift中做这样的事情吗?你能找到谁打给你的吗?
一个类似的问题:在示例中,您能找出选择器(示例中的“ s”)属于哪个对象吗?
通常可以迭代程序的堆栈跟踪,但是您需要调试符号来确定self
方法参数的位置,并且在优化的构建中甚至可能不再存在该参数,或者调用程序可能已被内联,或者优化器一时兴起,却遭受了其他破坏性的命运。因此,虽然可以大致了解调用您的方法,但无法self
在已部署的,无符号的,优化的构建上获取调用方的参数。
不,也不可能从选择器中获取类。选择器实际上只是一个标识方法名称的字符串,例如“ fixer:”。该#selector()
语法仅确保编译器为方法生成正确的选择器名称(考虑最终的@objc
注释),并帮助重构工具了解正在发生的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句