2015-07-30 2 views
1

Я довольно новичок в сфере iOS. Исходя из Java и Android-фона, я сталкиваюсь с несколькими проблемами при изучении цели C.Расширение класса vs Первичный интерфейс vs Категория

Мой вопрос: Я понимаю, как эти три отличаются друг от друга, но я не понимаю их практические примеры на практике.

Нужно ли расширение класса для каждого класса с частными функциями? Что такое использование категории, когда мы можем расширить класс Cocoa/Cocoa-touch в интерфейсе и добавить пользовательские функции? Пожалуйста, предоставьте пример из вашего опыта.

ответ

2

Категория добавляет методы в класс во время выполнения. Что касается среды выполнения, то методы, реализованные в расширении класса, - это методы, доступные для самого класса. Категория в 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.

+0

спасибо! нормально ли не предоставлять расширение и просто выполнять частные функции? Как мы получаем доступ к функциям Catrgory из UIColor, импортируя сам UIColor, класс Category или оба? – Kay

+0

Оба. 'UIColor' может быть импортирован с помощью' #import 'и ваш файл' #import "UIColor + YourColor.h" ' – avismara

+0

очень полезен. конечно, плохо помню эту дискуссию уже давно :) cheers – Kay

2
  • Класс Extesions: Если вы имеете в виду методы расширения, как в .NET, то она называется категории в Objective-C.
  • Категории: Это не что иное, как методы расширения, что позволяет добавлять методы в существующие классы от IOS SDK (например, NSString, NSURL и т.д.) Для получения более подробной информации: Apple Doc: Category

  • Первичный интерфейс: Определение класса (интерфейс в терминах Objective-C) внутри файла реализации, называемого основным интерфейсом.

    //ClassName.mm @interface ClassName() { 
        Declarations; 
    } 
    - Methods; 
    + Methods; 
    @end 
    
    @implementation ClassName 
    @end 
    

    Так, Категории также один тип первичных интерфейсов.

4
  • Категория это способ разделить единое определение класса в множественную категорию Служит для расположения файлов может быть объявлен для любого класса, даже если у вас нет оригинальной реализации источника code.At выполнение, нет никакой разницы между методом, добавленным категорией и одним, который реализуется исходным классом.

пример для категории:

 NSString+UrlString.h 
    #import <UIKit/UIKit.h> 
    @interface NSString(Additions) 

    +(void)urlMethod; 
    @end 

     NSString+UrlString.m//implmentation 
     #import "NSString+Additions.h" 

     @implementation NSString (Additions) 

     +(void)urlMethod 
     { 
     } 

     @end 
  • Основной интерфейс для класса используется для определения способа, что и другие классы, как ожидается, чтобы взаимодействовать с ним. Другими словами, это открытый интерфейс для класса.

  • Расширения классов часто используются для расширения открытого интерфейса с помощью дополнительных частных методов или свойств для использования в реализации самого класса.

    расширений класса используются для объявления частных метод в объективных C

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

    Методы, объявленные расширением класса, реализованы в блоке реализации исходного класса, поэтому вы не можете, например, объявить расширение класса в классе фреймворка, например класс Cocoa или Cocoa Touch, такой как NSString ..

    синтаксис объявить расширение использует @interface ключевое слово, так же, как стандартный Objective-C

    @interface ClassName() 
    
    @end 
    

    вы можете обнаружить, что вы хотите расширить существующий класс, добавив поведение, которое полезно только в определенных ситуациях. Please refer this

Смежные вопросы