类扩展与主接口和类别

时间:2015-07-30 08:21:41

标签: ios objective-c

我对iOS领域相当新。来自Java和Android背景我在学习目标C时面临的挑战很少。

我的问题:我理解上面三个是如何彼此不同但我在实践中无法理解他们的用例。

我们是否需要具有私有功能的每个类的类扩展?当我们可以在接口中扩展Cocoa / Cocoa-touch类并添加自定义函数时,Category的用途是什么?请根据您的经验提供一些示例。

3 个答案:

答案 0 :(得分:4)

  • 类别是一种将单个类定义拆分为多个文件的方法。即使您没有原始实现源代码,也可以为任何类声明类别。在运行时,有由类别添加的方法与原始类实现的方法之间没有区别。

类别示例:

     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

答案 1 :(得分: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
    

    因此,类别也是一种主要接口。

答案 2 :(得分:2)

类别是在运行时向类中添加方法。就运行时而言,在类扩展中实现的方法是可用于类本身的方法。 Objective-C中的类别是其他编程语言(如C#)中Monkey Patching的一个奇特名称。你可以阅读它here

话虽如此,如果您希望每个 UIColor在整个模块中拥有该行为,您可以使用某种方法为UIColor创建一个类别。子类化不是这种情况。只有子类(理论上讲)UIColor对象才能获得这些行为,因为对象的类型存在明显差异。

示例:

UIColor内置的方法可以为您提供不同的颜色;你可以致电UIColor.greenColor()获得绿色; UIColor.blackColor()获得黑色等等......

假设你想以类似的方式调用你自己的东西,你就像这样创建一个类别(swift中的例子)

extension UIColor {
    static func yourColor() -> UIColor {
       return UIColor(red:220/225,green:222/225,blue:223/225)
    }
}

这样,您可以拨打UIColor.yourColor()。您将使用的每个UIColor都可以使用此方法。比子类更方便,不是吗?

创建子类具有多态含义;类别没有。只有当您需要优化现有类并在需要时将其视为父级和子级时才进行子类化。作为Java开发人员,您会知道子类何时有意义。

扩展名最适合您希望在.m文件中声明的私有方法。将扩展名视为.m文件的私有类别。