NSStringFromSelector 返回变量名而不是变量值

Posted

技术标签:

【中文标题】NSStringFromSelector 返回变量名而不是变量值【英文标题】:NSStringFromSelector returns variable name instead of variable value 【发布时间】:2020-12-22 13:35:21 【问题描述】:

我正在使用 netmera 分析工具的事件结构,它会自动生成任何代码,如下所示。

不幸的是,根据结构,它必须使用选择器获取变量的值,当我测试它时,它会带来变量的名称而不是变量的值。

你能帮忙解决这个问题吗?

class SearchControlEvent: NetmeraEvent 
    
    @objc let kSearchControlEvent: String = "xyxyxy"
    
    @objc var name: String = "test_data_1"
    @objc var screen: String = "test_data_2"
    @objc var current: String = "test_data_3"
    
    override class func keyPathPropertySelectorMapping() -> [AnyHashable: Any] 
        
        let name = NSStringFromSelector(#selector(getter: self.name))
        let screen = NSStringFromSelector(#selector(getter: self.screen))
        let current = NSStringFromSelector(#selector(getter: self.current))
    
        print(name) // print: name
        print(screen) // print: screen
        print(current) // print: current
        
        return[
            "xxx": NSStringFromSelector(#selector(getter: self.name)),
            "yyy": NSStringFromSelector(#selector(getter: self.screen)),
            "zzz": NSStringFromSelector(#selector(getter: self.current))
        ]
    
    
    override var eventKey : String 
        let key = NSStringFromSelector(#selector(getter: self.kSearchControlEvent))

        print(key) // print: kSearchControlEvent

        return key
    

【问题讨论】:

看起来你在找value(forKey:)developer.apple.com/documentation/objectivec/nsobject/…如果你需要一个非对象的结果(即值类型),做起来有点麻烦,但还是可行的***.com/a/43714950/5329717 【参考方案1】:

NSStringFromSelector 仅返回选择器的字符串表示形式: https://developer.apple.com/documentation/foundation/1395257-nsstringfromselector?language=objc 如果需要该值,则需要调用选择器。

【讨论】:

谢谢您的回答,请您给一个代码示例。我想获取变量值。【参考方案2】:

访问该属性将在后台使用选择器,您无需显式执行此操作。这应该有效:

override var eventKey : String 
    return self.kSearchControlEvent

【讨论】:

谢谢你的作品。但是keyPathPropertySelectorMapping函数不能作为self.screen访问 那个函数是一个类函数,所以你可以像let mapping = SearchControlEvent. keyPathPropertySelectorMapping()一样访问它【参考方案3】:

你需要执行选择器:

let nameSEL = NSStringFromSelector(#selector(getter: self.name))
let name = self.performSelector(nameSEL)?.takeUnretainedValue() as? String

【讨论】:

以上是关于NSStringFromSelector 返回变量名而不是变量值的主要内容,如果未能解决你的问题,请参考以下文章

iOS打印方法名

消息转发流程

OC中实现锁

使用 swift 记录方法签名

KIF 无法强制应用程序进入后台

activity对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行