【问题标题】:respondToSelector / performSelector with parameter from a string in Swift 3respondToSelector / performSelector,参数来自 Swift 3 中的字符串
【发布时间】:2016-12-07 15:11:55
【问题描述】:

我必须调用一个类的方法。这种方法可能存在或不存在。 我正在寻找 2 小时后的解决方案。 以下工作无参数sayHello()

我有课:

class myClass: NSObject {
    func say(something:String){
        print("I say : \(something)")
    }

    func sayHello(){
        print("Hello")
    }
}

第一步:从带有参数的字符串创建选择器

let selector = NSSelectorFromString("sayHello" ) 
let selectorWithParam = NSSelectorFromString("say:" ) 

第二步:测试方法是否存在

self.bot?.responds(to: selector)// true
self.bot?.responds(to: selectorWithParam) // false        

它不适用于参数!

此外,我尝试使用 Swift3 #selector,但我发现无法从字符串中输入方法

【问题讨论】:

    标签: swift3 selector nsobject performselector respond-to


    【解决方案1】:

    Swift 方法

    func say(something:String)
    

    映射到Objective-C为

    - (void)sayWithSomething:(NSString * _Nonnull)something;
    

    因此正确的选择器应该是

    let selectorWithParam = NSSelectorFromString("sayWithSomething:" )
    

    使用#selector 更不容易出错:

    let selectorWithParam = #selector(myClass.say(something:))
    

    【讨论】:

    • 谢谢,如何从变量创建#selectorlet myMethod = "sayWithSomething" 方法可以是任何东西,我必须在调用它之前检查它是否存在
    • @DamienRomito:您不能将#selector 与变量一起使用。如果您确实需要从任意字符串动态创建选择器,那么您只能使用NSSelectorFromString。 (知道为什么你需要它会很有趣。)
    • 我的应用程序的行为取决于可定制的 json。此 json 列出要调用的方法。
    • 请注意,这是有潜在危险的。如果 JSON 包含一个恰好是 NSObject(Protocol) 方法的方法名称(例如 release)怎么办。在对象上调用该方法会导致内存损坏。 ——无论如何,你问为什么你的 NSSelectorFromString 不起作用,我(希望)回答了这个问题。
    • 是的,我找到的更好的解决方案是使用“switch case”将变量匹配到相应的方法。这样,不危险。谢谢马丁!祝你 Stackoverflow 的任务好运 ;)
    猜你喜欢
    • 2023-03-18
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多