所以前几天我厌倦了输入重复的addTarget:action:forControlEvents:s,而宏只是娱乐这么久,所以我这样做了:
@implementation UIControl (xx)
-(void)addTarget:(id)target action:(SEL)action
{
[self addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
}
@end
,只需将其添加到相关.m文件的顶部。
当然很有效,但请注意“xx”。
NAME这样的“无名”类别最棒的是什么?
请注意,它确实 NEEDS NO NAME,因为名称永远不会在任何地方使用。最好的办法就是不给它起名字 - 但从语法上讲,你不能把它留空。
(如果你把xx留空 - 它就变成了一个“扩展”,这是完全不同的。)
我想的可能是:
(顺便说一下......看来你不实际上需要包含这样一个类别的界面,即你可以省略......
//you can actually get away without these lines...
//#import <UIKit/UIControl.h>
//@interface UIControl (x)
//-(void)addTarget:(id)target action:(SEL)action;
//@end
......那部分并且工作正常。)
对于喜欢分类的人,以及不喜欢分类的人,这个令人不安的问题的答案是什么?
您应该为“无名”类别 命名,其中名称永远不会再次使用且无关紧要 ,因为文本仅直接在顶部输入一个.m文件只能在该文件中使用?
答案 0 :(得分:3)
Extension与Category 相同,但额外的方法必须与原始类进入相同的实现。
这对于将私有方法添加到不需要在头文件中公开或重新声明@properties的类非常有用。
显然,在将类别添加到没有源代码的类时,不能使用此功能。例如 UIControl
至于我如何命名类别:我使用我的三字母前缀和“扩展”一词,例如:
UIControl (ADNExtensions)
答案 1 :(得分:3)
我只使用Private
。因为他们是,私下......我很想听听人们对此的看法。 :)
答案 2 :(得分:1)
我看不出_
有什么问题。
答案 3 :(得分:1)
我喜欢这样的命名约定“UIControl + MyClassName”,并且通常将命名类别添加到系统类“UIControl + MyPurpose”。
答案 4 :(得分:1)
如果它是一个快速的,袖手旁观的类别,那么我会称之为DDAdditions
。如果它应该更正式,那么我将弄清楚该类别的定义目的是什么,并从中构建一个名称。
修改更多信息:
这就是我的所作所为:
当我命名包含该类别的文件时,它的格式始终为:
BaseClass+CategoryName.h/m
因此,如果我有一个名为UIButton
的{{1}}类别,则该文件的名称为FooBar
。在我的源代码树中看到这个构造会立即告诉我2个(可能是3个)事情:
如果我在单个文件中声明多个类别,那么“BaseClass”位可能会根据扩展类的相关方式而有所不同。
UIButton+FooBar.h/m
和NSArray
扩展为提供不可变和可变变体的类别[例如:NSMutableArray
和{{ 1}}]),然后我只使用-[NSArray shuffledArray]
作为基类。-[NSMutableArray shuffle]
。提出正确的类别名称需要练习。如果我赶时间或只是添加一个类别来尝试一些东西,我将使用“DDAdditions”(我的缩写+“Additions”)。如果我使用类别隐藏类的方法,我会使用“私有”或“内部”之类的东西。
否则,我找到了这些方法的目的并构建了一个名称。
例如,如果我向NSArray
添加方法以获取其键值对并将URL编码为查询字符串,那么我将调用类别Collections+CategoryName.h/m
或{{ 1}}或类似的东西。
这里的主要原则是描述性的。真的,无论你称之为什么类别,或者你的名字是什么,只要它清楚它们是什么。 (我们喜欢Objective-C的一个原因是它的详细程度使它在很大程度上是自我记录的)唯一需要注意的是确保你的类别与另一个类别的名称不同类。 (以及您的方法名称不会发生冲突等)
答案 5 :(得分:1)
类别的问题在于编译器和链接器需要类别的名称才能区分符号,否则它无法找到符号并正确构建类。所以称之为“私人”,“添加”或“便利”,但无论如何你都需要一个名字,如果你碰巧在不同文件中为同一个班级分别有两种类型,我建议你去找不同的名字,或更好的:遵循戴夫的建议。
注意,可能已经为类扩展删除了名称,因为它们只是接口,很容易指示编译器忽略类别名称,只需将方法作为临时声明添加到主类块中,从而放置未实现方法时@implementation内的警告。
对于类别,您不需要将@interface与@implementation匹配,反之亦然:@interface将仅包含您不一定需要实现的声明(但是,不要尝试调用它们)如果它们没有实际实施,你将会崩溃...)。如果在使用之前将@implementation单独放在没有@interface的情况下,编译器将存储方法声明,从而删除“可能不响应选择器”警告。
注意:您也可以编写Xcode宏来直接构建“便利”类别......
答案 6 :(得分:0)
我更喜欢以他们所做的命名。在你给出的例子中,我称之为“UIControl + Convenience”或“UIControl + Targets”。 KWTargets或JBTargets也没关系。您的大多数示例都会告诉您很少或根本没有关于该类别的作用,当您尝试理解不熟悉的代码时(或者因为其他人编写它,或者因为您暂时没有查看它),这会让您感到困惑。