类扩展 vs 主接口 vs 类别

Posted

技术标签:

【中文标题】类扩展 vs 主接口 vs 类别【英文标题】:Class Extension vs Primary Interface vs Category 【发布时间】:2015-07-30 08:21:40 【问题描述】:

我对 ios 领域还很陌生。来自 Java 和 android 背景,我在学习目标 C 时面临一些挑战。

我的问题:我了解上述三个之间的不同之处,但我无法理解它们在实践中的用例。

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

【问题讨论】:

【参考方案1】: 类别是一种将单个类定义拆分为多个文件的方法。可以为任何类声明一个类别,即使您没有原始实现源代码。在运行时,两者之间没有区别由类别添加的方法和由原始类实现的方法。

类别示例:

     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

类的主接口用于定义其他类与其交互的方式。换句话说,它是类的公共接口。

类扩展通常用于使用额外的私有方法或属性扩展公共接口,以便在类本身的实现中使用。

类扩展用于在Objective C中声明私有方法

例如,在接口中将属性定义为只读,但在实现上面声明的类扩展中定义为读写,以便类的内部方法可以直接更改属性值。

类扩展声明的方法是在原始类的实现块中实现的,所以你不能在框架类上声明类扩展,比如像 NSString 这样的 Cocoa 或 Cocoa Touch 类。 .

声明扩展的语法使用@interface 关键字,就像标准的Objective-C

@interface ClassName ()

@end

您可能会发现您希望通过添加仅在某些情况下有用的行为来扩展现有类。 Please refer this

【讨论】:

【参考方案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 文件的私有类别。

【讨论】:

谢谢!不提供扩展而只实现私有功能可以吗?我们如何通过导入 UIColor 本身、Category 类或两者来访问 UIColor 的 Catrgory 函数? 两者。 UIColor 可以使用#import &lt;UIKit/UIKit.h&gt; 导入,您的文件可以通过#import "UIColor + YourColor.h" 导入 非常有帮助。当然,我已经很久不记得这个讨论了:) 干杯 没问题。很高兴我能帮助你。 :)【参考方案3】: 类扩展:如果您指的是 .Net 中的扩展方法,那么它在 Objective-C 中称为类别。

类别:这些只是扩展方法,它允许在 iOS SDK 的现有类中添加方法(如 NSString、NSURL 等) 更多详情:Apple Doc: Category

主接口:在其实现文件中编写一个类(Objective-C 中的接口)定义,称为主接口。

//ClassName.mm @interface ClassName() 
     Declarations; 

- Methods;
+ Methods;
@end 

@implementation ClassName 
@end

所以,类别也是一种主要接口。

【讨论】:

以上是关于类扩展 vs 主接口 vs 类别的主要内容,如果未能解决你的问题,请参考以下文章

Objective C 类别 vs 开放/封闭原则

获取VS代码Python扩展以连接到远程AWS EMR主节点上运行的Jupyter。

VS扩展开发 一 导航

VS Code:对具有相同名称和不同扩展名的文件进行分组

python编写 VS 使用测试工具

分类(类别/Category)与 类扩展(Extension)