swift - "Extensions must not contain stored properties"阻止我重构代码

标签 swift refactoring coordinator-pattern

我有一个 13 行的函数,在我的应用程序中的每个 ViewController 中重复,整个项目总共有 690 行代码!

/// Adds Menu Button
func addMenuButton() {
    let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
    let menuImage = UIImage(named: "MenuWhite")
    menuButton.setImage(menuImage, for: .normal)

    menuButton.addTarget(self, action: #selector(menuTappedAction), for: .touchDown)
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: menuButton)
}
/// Launches the MenuViewController
@objc func menuTappedAction() {
    coordinator?.openMenu()
}

为了使 menuTappedAction 函数起作用,我必须像这样声明一个弱变量:
extension UIViewController {

weak var coordinator: MainCoordinator?

但是这样做我得到错误Extensions must not contain stored properties 到目前为止我尝试了什么:

1) 删除 weak关键字会在我的所有应用程序中引起冲突。
2)以这种方式声明:
weak var coordinator: MainCoordinator?
extension UIViewController {

将使错误静音,但协调器不会执行任何操作。任何建议如何解决这个问题?

最佳答案

您可以移动您的addMenuButton()对具有协议(protocol)扩展的协议(protocol)起作用。例如:

@objc protocol Coordinated: class {
    var coordinator: MainCoordinator? { get set }
    @objc func menuTappedAction()
}

extension Coordinated where Self: UIViewController {
    func addMenuButton() {
        let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
        let menuImage = UIImage(named: "MenuWhite")
        menuButton.setImage(menuImage, for: .normal)

        menuButton.addTarget(self, action: #selector(menuTappedAction), for: .touchDown)
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: menuButton)
    }
}

很遗憾,您无法添加 @objc类扩展的方法(见:this stackoverflow question),所以你仍然需要像这样设置你的 View Controller :
class SomeViewController: UIViewController, Coordinated {
    weak var coordinator: MainCoordinator?
    /// Launches the MenuViewController
    @objc func menuTappedAction() {
        coordinator?.openMenu()
    }
}

它会为你节省一些代码,它会让你重构更大的函数 addMenuButton() .希望这可以帮助!

关于swift - "Extensions must not contain stored properties"阻止我重构代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944431/

相关文章:

ios - 无法将类型 'NSTaggedPointerString' 的值转换为 'NSDictionary'。 swift/火力基地

objective-c - Swift 长按结果

ios - 如何将 String.UTF8View.Index 转换为 String.CharacterView.Index?

swift - 获取在初始化之前使用的 "Variable ' self.xxx',即使在保护 self 和非可选属性之后

ios - SwiftUI MVVM 协调器/路由器/导航链接

ios - 当服务器返回空值时,如何在 swift 中将字符串设置为空?

java - 在读取 java 中的映射结构时重构过多的 if...else 语句

java - 将枚举方法链接到客户端类的成员变量

java - 以编程方式重构参数名称

swift - UIViewController 不取消初始化(mvvm + 协调器)