Разница между методом swizzling и категорией в Objective c

Я просто понял метод swizzling, выполненный в obj c Method Swizzling и опасности использования метода swizzling, и не мог помочь провести сравнение между методом swizzling и переписыванием метода с использованием категорий. Они оба помогают переопределить функциональность предопределенных методов инфраструктуры. Так есть ли разница между ними или они могут использоваться взаимозаменяемо?

Основное отличие состоит в том, что Objective C не позволяет вам использовать исходную реализацию из переопределения категории. Это связано с тем, что super вызовы Objective-C начинаются с суперкласса, тогда как категории переопределяют методы на одном уровне класса.

С другой стороны, метод swizzling позволяет вам также ссылаться на исходную реализацию, чтобы вы могли называть ее из своей реализации. Например, в статье по вашей первой ссылке автор пишет следующее:

 - (void) logged_viewDidAppear:(BOOL)animated { [self logged_viewDidAppear:animated]; NSLog(@"logged view did appear for %@", [self class]); } 

Вторая строка вызывает вызов метода logged_viewDidAppear: который выглядит как безусловный вызов для себя, который должен вызывать бесконечную рекурсию. Однако это не то, что происходит: после swizzling этот вызов трансформируется в вызов исходного viewDidAppear: из-за того, как работает метод swizzling.

Напротив, переопределение метода из категории не дает вам доступа к логике метода, который вы переопределяете. Он позволяет вам заменить логику, но она не позволяет вам расширять ее.

  extension UIViewController{ public func myViewDidLoad(){ self.viewDidLoad() //but you need to call this method everywhere replacing } //you cant do this public func viewDidLoad(){ self.viewDidLoad() //my code } } 

Категории или расширение позволяют сделать это: Добавить вычисленные свойства и свойства вычисленного типа

Определение методов экземпляра и методов типа

Предоставить новые инициализаторы

Определение индексов

Определить и использовать новые вложенные типы

Сделать существующий тип соответствующим протоколу

(от Apple)

Они не позволяют вам распространять оригинальный метод того же класса, который вы распространяете, и если вы попытаетесь, как и выше, возникает конфликт подписи кода.

Вы можете проверить этот веб-сайт, чтобы схематично поняла концепцию. Мне это очень понравилось.

http://matteogobbi.github.io/blog/2014/12/15/extending-methods-in-a-category-by-method-swizzling/

Обязательно проверьте эту замечательную статью на предмет хорошей реализации: http://nshipster.com/method-swizzling/