#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. Спасибо! Понял это — я неправильно назвал свойства.