Різниця між розширенням категорії та розширенням класу?


85

У чому різниця між категорією та розширенням класу. Я вважаю, що обидва використовуються для додавання власних методів у існуючі класи. Хтось може пролити на це світло? Пояснення з кодом буде дуже вдячне.



3
Akusete, сторінку знайти не вдається.
Adil Hussain

чітко проілюстровано тут, code.tutsplus.com/tutorials/…
grassyburrito

Відповіді:


103

Категорія - це спосіб додавання методів до існуючих класів. Зазвичай вони містяться у файлах "Class + CategoryName.h", наприклад "NSView + CustomAdditions.h" (і .m, звичайно).

Розширення класу - це категорія, за винятком 2 основних відмінностей:

  1. Категорія не має назви. Це оголошено так:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @end
  2. Реалізація розширення повинна знаходитися в основному блоці @implementation файлу.

Досить часто можна побачити розширення класу у верхній частині файлу .m, що декларує більше методів у класі, які потім реалізуються нижче в головному розділі @implementation класу. Це спосіб оголосити "псевдоприватні" методи (псевдоприватні в тому, що вони насправді не приватні, а не зовнішні).


13
У Class-Extensiosn ви можете перезаписати властивості із (загальнодоступної) властивості, доступної лише для читання, для внутрішнього читання. А оскільки LLVM 1.5 ви можете зробити ще більше: тепер ви можете оголосити змінні екземпляра у розширенні класу, щоб вони перейшли зі звичайного інтерфейсу.
Макс Зелеманн

Навіщо додавати розширення класу, коли ви можете просто реалізувати ці методи та властивості страйт в класі? Мені здається трохи зайвим.
user1721803

1
@ user1721803 Як запропонував Дейв, ви, можливо, захочете залишити кілька властивостей / методів без експозиції. Це коли використовуються розширення. Розглянемо подання, ви можете підключити всі свої IBOutlets та IBActions у розширення та виставити методи, що дозволяють ініціалізувати / оновити точки продажу, а дії можуть бути делеговані назад.
GoodSp33d

@MaxSeelemann, чи можете ви, будь ласка, продемонструвати, як за допомогою короткого сценарію зробити "(загальнодоступну) властивість лише для читання для внутрішнього читання"? Дякую.
allenlinli

Ця відповідь зазначає розширення у файлі "Class + CategoryName.swift", чи правильно?
Ritesh.mlk

47
  1. Категорія

=> У цілі C, коли ви хочете додати ще деяку функціональність до класу без успадкування, ви просто використовуєте категорію для нього.

=> він поставляється зі своїми .h та .m файлом

=> Categoryвикористовує для додавання нового методу, а не властивостей.

  1. Розширення класу
-> In Objective C, when you want to make behaviour of some property private you use class extension.

-> it comes with **.h** file only.

-> mainly for properties.

Примітка: коли ми додаємо новий файл і вибираємо варіант цілі, категорія c відображає категорію та "категорію", а не "підклас", щоб вона відображала як

@interface className (categoryName)
@end

-Ви отримаєте два файли .h та .m з іменем файлу як ( className + categoryName.h та className + categoryName.m )

а у випадку продовження ви отримаєте

@interface className()
@end

-Ви отримаєте лише один файл із назвою className_extensionName.h

  • У категорії ви не є власником класу, але в розширенні ви є.

5
@Prasanna: розширення класу постачається лише з файлом .m, а не у
форматі

1
розширення класу має лише файл .h, а не .m
Nishu_Priya

32
  1. Категорія - це спосіб додавання методів до класу, доступний чи ні вихідний код, тобто ви можете додавати категорію до базових класів, наприклад NSString а також до власних користувацьких класів.

    Розширення можна додавати лише до класів, вихідний код яких доступний, оскільки компілятор компілює вихідний код та розширення одночасно.

  2. Ми можемо додавати змінні та властивості додаткового екземпляра в розширення класу, але не в категорію.

  3. Будь-яка змінна та метод всередині розширення навіть недоступні для успадкованих класів.

  4. Категорія та розширення в основному створені для обробки великої бази коду, але категорія - це спосіб розширення API класу в декількох вихідних файлах, тоді як розширення - це спосіб додавання необхідних методів за межами основного файлу інтерфейсу.

  5. Використовуйте категорію, коли вам потрібно розбити один і той самий код класу на різні вихідні файли відповідно до різних функціональних можливостей, і розширення, коли вам просто потрібно додати деякі необхідні методи до існуючого класу за межами основного файлу інтерфейсу. Крім того, коли вам потрібно змінити загальнодоступну змінну екземпляра в класі, наприклад, readonly для читання, ви можете повторно оголосити її в розширенні.


3
Я прочитав 5 подібних запитань з багатьма відповідями, і це найкраще. Дякую!
Мед

1
Ви також можете додати властивості в категорію. Дивіться відповідь @Pebby.
atulkhatri

7

Розширення : зробити методи приватними та додати властивості нашого власного класу, а не класу Apple.

Категорія : Щоб додати більше методів до існуючого класу, а не властивості, його можна використовувати як для власного класу, так і для класу Apple NSString.


Просто і елегантно. Так тримати
Абдул Ясін

3

Ми також можемо мати властивості, використовуючи властивість, пов’язану з набором, у класі категорії.

@interface SomeClass (Private)

@property (nonatomic, assign) id newProperty;

@end

NSString * const kNewPropertyKey = @"kNewPropertyKey";

@implementation SomeClass (Private)

@dynamic newProperty;

- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}

- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}

@end

Посилання: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/


2
@interface SomeClass ()


- (void) anAdditionalMethod;


@end

Я думаю, це не спосіб оголосити категорію. Категорія повинна мати назву

@interface SomeClass (XYZ)


- (void) anAdditionalMethod;


@end

наприклад

@interface NSMutableArray (NSMutableArrayCreation)

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

@end

Задекларовано для NSMutableArray від Apple


Ось як ви заявляєте і розширення, а не категорію -> @interface SomeClass ()
ChavirA

0

розширення ios подібне до c #, абстрактний клас Java або інтерфейс
ios категорія подібне до c #, розширення класу java


4
ваша відповідь так само, як "кішка схожа на тигра, відповідає сліпому". Lol
Muruganandham K

1
насправді це не так. Це найпряміше і швидше пояснення, якщо ви знаєте c # або java.
Add080bbA

Зовсім не дуже описовий, і ледь відповів на запитання.
KVISH

0

Категорії

Категорії використовуються, коли ви створюєте файл, що містить велику кількість методів, тому вони надають вам можливість розбити один клас на різні модулі. Крім того, якщо в категорії вносяться якісь зміни, компілятор не витрачає час на компіляцію всього проекту .Категорії не можуть додавати нову змінну або властивості і шукати їх батьківський клас. Ви можете замінити метод у категорії, але це не є гарною ідеєю, оскільки метод не може бути перевизначений. Також потік може бути здійснений, оскільки всі категорії мають під час виконання можуть існувати однаковий ієрархічний рівень, а отже, дві категорії, що належать до одного батьківського класу. Також захищені методи можна створити за допомогою категорій

Розширення

Розширення дозволяють замінити властивість або додати нову властивість до існуючого батьківського класу. Синтатично те саме до категорій, у яких вони не мають імені та представлені як клас @interface () Файл .m відсутній, а метод, оголошений у розширенні, повинен бути реалізований у @ реалізації батьківського файлу

Більше довідки за цим посиланням


0

Ось моє розуміння:

Розширення зазвичай використовуються для додавання додаткових функцій до нашого власного " користувацького класу ". Ми можемо додати приватні методи або властивості, що розширюють інтерфейс класу, які можуть бути використані в рамках реалізації класу.

Розширення слід писати в тому ж файлі, що і клас. Отже, ви не можете писати розширення для попередньо визначених типів, таких як String, Float тощо.

З іншого боку, категорії можна використовувати для додавання додаткових методів до вже існуючих класів. Наприклад, ми можемо створити власні методи, розширивши клас String. Зверніть увагу, що ми не можемо створити додаткові властивості в категоріях. Також головною перевагою категорій є те, що ми можемо писати категорії в будь-який інший файл, за межами файлу, з якого виходить ваш клас.

Також під час створення категорій ви повинні дати їм назву в дужках. Але для розширення ім'я не потрібно. Тому іноді їх також називають анонімними категоріями.


Ви трохи не в курсі.
Абдул Ясін

@iPhoneDeveloper Ми можемо написати розширення для попередньо визначених типів. Будь ласка , перевірте це посилання - stackoverflow.com/a/33942484/2060508
yo2bh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.