Категория добавляет методы в класс во время выполнения. Что касается среды выполнения, то методы, реализованные в расширении класса, - это методы, доступные для самого класса. Категория в Objective-C - причудливое имя для Monkey Patching на других языках программирования, таких как C#. Вы можете прочитать об этом here.
С учетом сказанного, вы можете создать категорию для UIColor
с каким-либо способом, если вы хотите каждыйUIColor
иметь такое поведение на протяжении этого модуля. Это не относится к подклассу. Только объект с подклассом (теоретически говоря) UIColor
получит такое поведение, так как существует различная разница в типе объекта.
Пример:
UIColor
имеет встроенные методы, которые дают вам различные цвета; вы можете позвонить UIColor.greenColor()
, чтобы получить зеленый цвет; UIColor.blackColor()
, чтобы получить черный цвет и так далее ...
Предположим, что вы хотите, чтобы ваши собственные, чтобы называться подобным образом, вы создаете категорию (пример в стрижа) как так
extension UIColor {
static func yourColor() -> UIColor {
return UIColor(red:220/225,green:222/225,blue:223/225)
}
}
Таким образом, действителен для звонка UIColor.yourColor()
. Каждый UIColor
, который вы используете, имеет этот метод. Удобно, чем подклассы, не так ли?
Создание подкласса имеет полиморфные последствия; категорий нет. Вы выполняете подкласс только тогда, когда вам нужно уточнить существующий класс и при необходимости обработать его как родителя, так и ребенка.Как разработчик Java, вы должны знать, когда это имеет смысл для подкласса.
Расширение является лучшим для частных методов, которые вы хотели бы объявить в своем .m
файле. Подумайте о расширении как категории, приватной для файла .m
.
спасибо! нормально ли не предоставлять расширение и просто выполнять частные функции? Как мы получаем доступ к функциям Catrgory из UIColor, импортируя сам UIColor, класс Category или оба? – Kay
Оба. 'UIColor' может быть импортирован с помощью' #import 'и ваш файл' #import "UIColor + YourColor.h" ' –
avismara
очень полезен. конечно, плохо помню эту дискуссию уже давно :) cheers – Kay