【问题标题】:Swift3.0: Can not call value of non-functional type'((Selector!)->Bool)!'Swift3.0:不能调用非函数类型的值'((Selector!)->Bool)!'
【发布时间】:2016-11-01 08:41:58
【问题描述】:

我必须将我的 swift 2.x 代码迁移到 Swift 3.0。在这种情况下,我发现了一个问题“无法调用非功能类型的值 ((Selector!)-> Bool)!”。 我用谷歌搜索但没有找到解决我问题的任何好的解决方案。

我有一堂课,是用 Objective-C 写的:

@interface AEngineBool : AEngineData
 @property BOOL value; 
 @end

还有另一个视图控制器类,我像这样使用 respondToSelector 访问它

 let param: AnyObject = params[0]
 if param.responds(#selector(AEngineBool.value)) {
    let iType: Bool = param.value
// Something
}

并在上面提到的 param.response() 点上出现错误。

如果我改变了 if (param.responds(to: #selector(getter: AEngineBool.value))),然后我收到错误 Ambiguous use for 'value(forKey:)'。

【问题讨论】:

    标签: ios objective-c swift3 ios10


    【解决方案1】:

    好的,看来你有 3 个问题:

    1. responds() 使用了错误的签名
    2. value 是一个 getter,应该这样标记,并且
    3. “值”属性名称不明确。

    看这个:

    if param.responds(to: #selector(getter: AEngineBool.value)){
         let iType = param.value // gives error 'value' is ambiguous
         // something?
    }
    

    但如果我在您的原始类上创建另一个 BOOL 属性,它的名称会更独特:

    @interface AEngineBool : NSObject
    @property BOOL value;
    @property BOOL uniquePropertyName;
    @end
    

    那么这一切都很好:

    if param.responds(to: #selector(getter: AEngineBool.uniquePropertyName)){
          let iType = param.uniquePropertyName
          // something?
    }
    

    所以我认为value 只是一个词的概括,并与 value(forKey:) 和其他人发生冲突......

    【讨论】:

    • 感谢您的帮助 :)
    【解决方案2】:

    也无法弄清楚 XCode 给出的错误,但我会围绕它编写代码。这对您的实施有用吗?

        let param: AnyObject = params[0]
        if param is AEngineBool {
            let iType: Bool = param.value
            // something?
        }
    

    【讨论】:

    • “param is AEngineBool”是什么意思?
    • 是检查'params'是否属于AEngineBool类的方法
    • 好的,谢谢您的解决方案。
    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 2016-11-26
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2017-07-02
    相关资源
    最近更新 更多