iOS中的类别与实用程序类

时间:2015-05-21 12:13:38

标签: ios objective-c objective-c-category

为什么实用程序类在iOS中被认为是不好的做法?和类别用作替代而不是辅助类/实用程序类。我们从实用程序类中获得的类别中是否有任何特殊的好处?

3 个答案:

答案 0 :(得分:5)

类别有特定目的。由于某些原因,它们在类外部的代码中扩展了类的功能(您没有原始源,您希望该类别具有不同的可见性,...)。

当你说“助手”课时,这听起来像代表而不是类别......或者只是简单的构图。

实际的实用程序类 - 没有实例或状态的实用程序类 - 确实存在于需要的地方。

答案 1 :(得分:1)

在iOS中,实用程序并不是一个坏习惯。有时候,如果你需要一个具有特定共同目标的有用函数的中心枢纽(即:用于解析objective-c中的双精度或整数的MathUtils类),那么将它们包含在内是有意义的。

话虽如此,按照惯例,类别/扩展被认为更好,因为它们允许您直接在对象本身上操作,而无需分配内存/实例化其他对象。例如,您可以在NSNumber对象上创建一个类别,以便轻松地除以数字,从而使您可以使用易于遵循的语言语法:即:

在swift中:

number.divideBy(2) 

或在objective-c

[number divideBy:2]

相反:

let utility = UtilityClass()
utility.divideNumber(number, by:2)

希望这有助于说服你开始使用类别,他们是你最好的朋友!

答案 2 :(得分:1)

不应该说公用事业类更糟糕。这取决于任务。

声明的原因可能是来自不同编程语言的开发人员不了解类别并只使用实用程序类,即使是类别也能更好地完成工作。这尤其是适用于实用程序类,其唯一目的是将现有父类拆分为更轻量级的部分。这类似于坏,因为它没有反映类的含义:如果将代码正确地放入语义中,则不应出于管理原因而破坏语义。它是班级的一部分,让它成为班级的一部分。

有一个简单的测试:如果你发现自己经常输入self.mastermaster为原始类)(特别是这是self的唯一用法很明显,实用程序类没有个人用途,完全适用于原始类。

但是,当然,如果你有一个单独的功能,支持一组单独的ivars,那么为它们添加额外的类可能是正确的。 (它们仍然是实用类吗?也许你应该问你的Q更具体。)