在Objective-C中,可以使用_cmd
作为objc_getAssociatedObject
的密钥,如NSHipster article中所述。在Swift中,只有__FUNCTION__
与_cmd
具有相同的用途。但我不确定这样做是否安全。
答案 0 :(得分:2)
objc_getAssociatedObject()
需要唯一指针作为键。
在Objective-C中,_cmd
具有类型SEL
,它是一个指针,并且是
根据参考文章的独特之处。
在Swift中,__FUNCTION__
的类型String
不是指针。
当传递给期望指针的函数时,字符串是
已转换(可能与Swift, Strings and Memory Addresses中的NSString
一样)。这不保证
转换在每次调用中产生相同的指针。这是一个简单的
演示Playground中问题的示例:
func bar(ptr : UnsafePointer<Void>) {
print(ptr)
}
func foo() {
bar(__FUNCTION__)
bar(__FUNCTION__)
}
foo()
输出:
0x00007f8173c06500
0x00007f8173e00020
正如您所看到的,相同的__FUNCTION__
被传递为两个不同的
指向bar()
函数的指针。
似乎在已编译的项目中,您将获得相同的指针 每个电话,但据我所知 - 没有记录,从那以后 它在游乐场不起作用我不会依赖它。
因此我认为使用__FUNCTION__
为不安全
关联对象的关键。
安全的方法是使用全局属性的地址 如在Is there a way to set associated objects in Swift?中那样。
答案 1 :(得分:1)
将其用作关键字可以,它只是一个String
字面值。但是,在使用Swift时,您应该尽量避免使用objc_getAssociatedObject
和objective-c运行时,因为它不支持所有类型,并且违反了Swift中的安全性。希望手指交叉我们将使用Swift 3看到更多动态内省功能。