Swift — Есть ли способ запустить метод для объекта без вызова объекта? (Self?)

#swift #refactoring #extension-methods

#swift #рефакторинг #расширение-методы

Вопрос:

Быстрый вопрос по нескольким различным функциям, которые у меня есть, у всех одна и та же идея. У меня есть объект, и я хочу запустить с ним функцию. Но поскольку это расширение типа Objects , я вызываю 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:

Да, вы можете изменить свою функцию расширения на что-то вроде этого:

 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
    }
}
  

Комментарии:

1. Потрясающе! Это также относится к NSManagedObjects? Та же идея, что и выше, но вместо изменения BackButton в NavVC, свойства объекта?

2. @StonedStudio да, это цель расширений. Чтобы «расширить» функциональность типа.

3. Я знаю. Я просто не уверен, возможно ли сделать то же самое для других вещей. Как и упомянутый NSManagedObject . Например, я отредактировал другой пример.

4. Я не уверен, как к нему подключиться.

5. Спасибо! Понял это — я неправильно назвал свойства.