覆盖在swift中的扩展对象内不起作用

Posted

技术标签:

【中文标题】覆盖在swift中的扩展对象内不起作用【英文标题】:override does not work inside extension object in swift 【发布时间】:2019-01-09 09:31:57 【问题描述】:

我们最近正在尝试将我们基于 swift 的版本升级到 4.2。不幸的是,在升级时发现了很多问题。我们目前无法修复的其中之一是:

在以下代码中遇到了该错误:

不支持从扩展覆盖非@objc 声明

extension  MyHelpTableViewCell 
    override class var nib: UINib 
        return UINib(nibName: "MyHelpTableViewCell", bundle: nil)
    

如果您有经验,请帮助我如何解决该问题。非常感谢。

更新: 如果我添加了@objc 和这样的动态,

class MyHelpTableViewCell: WMHelpTableViewCell 


extension MyHelpTableViewCell 
    @objc class dynamic var nib: UINib 
        return UINib(nibName: "MyHelpTableViewCell", bundle: nil)
    

以下有同样的错误,

不支持从扩展覆盖非@objc 声明

【问题讨论】:

【参考方案1】:

错误很明显:

您必须将覆盖方法从extension 移动到class


或者你必须用@objc@dynamic标记基类中的声明

class BaseTableViewCell : UITableViewCell 
    @objc class dynamic var identifier : String  return "something" 

【讨论】:

我已将我的问题更新为添加您上面提到的代码 不行,@objc ... dynamic 必须添加到 base 类的声明中 我基于WMHelpTableViewCell 类创建了另一个MyHelpTableViewCell,它有自己的nib 类。基类WMHelpTableViewCell 有自己的nib,称为WMHelpTableViewCell ,子类MyHelpTableViewCell 有自己的nib,称为MyHelpTableViewCell。这就是为什么不能将它们移动到基于类的原因。 只有这两个选项可以覆盖一个属性。也许你可以改用一种方法。 我再次更新了我的问题。请你看一下好吗?【参考方案2】:

你可以在没有扩展的情况下达到同样的效果:

class WMHelpTableViewCell 
    var identifier: String!


class MyHelpTableViewCell : WMHelpTableViewCell 
    override var identifier: String? 
        get 
            return self.identifier
        
        set 
            self.identifier = newValue
        
    

【讨论】:

以上是关于覆盖在swift中的扩展对象内不起作用的主要内容,如果未能解决你的问题,请参考以下文章

swift isUserInteractionEnabled = false 在 UITapGestureRecognizer 内不起作用

SET 在批处理文件中的循环内不起作用[重复]

Clojure 交换!在 let 绑定中的 map 函数内不起作用

Alamofire 呼叫在循环内不起作用

React 组件在表单标签内不起作用

使用左组时,总和在 BI Publisher 中的每个组标记内不起作用