Swift-有没有一种方法可以在不调用对象的情况下在对象上运行方法? (自?)

时间:2020-09-29 18:02:15

标签: swift refactoring extension-methods

关于我拥有的一些不同功能的快速提问,都具有相同的想法。我有一个对象,并且我想用它运行一个函数。但是因为它是对象类型的扩展,所以我称object.method(on: object)。有没有一种方法可以简化它,使其无需声明就可以在其自身上运行?

示例:

import UIKit

extension UINavigationController {
    
    func removeBackButtonString(on navigationController: UINavigationController) {
        let backButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        navigationController.navigationBar.topItem?.backBarButtonItem = backButton
    }
    
}

在代码中使用:

navigationController?.removeBackButtonString(on: navigationController!)

但是有没有办法这样称呼?

navigationController?.removeBackButtonString()

或者,扩展NSManagedObject:

extension Object {
    func setFavorite(object: Object) {
        object.isFavorite = true
    }
}

使用:object.setFavorite(object: object)但是,如果没有该参数,如何利用object属性呢? 示例:object.setFavorite()

1 个答案:

答案 0 :(得分:1)

是的,您可以将扩展功能修改为以下形式:

extension UINavigationController {        
    func removeBackButtonString() {
        let backButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        // `self` is inferred in Swift
        navigationBar.topItem?.backBarButtonItem = backButton
    }
}

然后,它将运行得很好:

navigationController?.removeBackButtonString()

更新:第二个示例也是如此:

extension Object {
    func setFavorite() {
        isFavorite = true
    }
}