拥有许多"initWith"参数通常是不好的做法吗?

Vu *_*ran 5 iphone cocoa cocoa-touch objective-c ios

比方说,我有一个UIView的实现.UIView包含两个标签,一个图像和一个框架.

我的"init"方法最终看起来像:

- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)

那被认为是不好的做法吗?有一个简单的"initWithFrame"方法并将另一个标签和图片作为@properties更好吗?

bry*_*mac 7

没关系.Apple经常这样做.例如,看看NSString:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsstring_Class/Reference/NSString.html

– initWithBytes:length:encoding:
– initWithBytesNoCopy:length:encoding:freeWhenDone:
– initWithCharacters:length:
– initWithCharactersNoCopy:length:freeWhenDone:
– initWithString:
– initWithCString:encoding:
– initWithUTF8String:
– initWithFormat:
– initWithFormat:arguments:
– initWithFormat:locale:
– initWithFormat:locale:arguments:
– initWithData:encoding:
Run Code Online (Sandbox Code Playgroud)

但是,遵循这些模式,你的:

- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage*)image;
Run Code Online (Sandbox Code Playgroud)

应该是:

- (id)initWithFrame:(CGRect)frame labels:(NSArray *)labelArray image:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)

现在,话虽如此,我可能不会传递一系列标签.我会传递数据并让自定义视图获取该数据并创建/布局子视图.您可以在公共方法中公开构成自定义视图的内部视图,并且您可能希望在将来更改渲染和组合它们的方式.

另一种方法是使用委托来呈现标签,通过调用代表获取所需的数据来呈现标签 - 类似于表视图.


sud*_*-rf 5

虽然有多个参数很好,但你真的不应该有任何未命名的参数.在您的情况下,要调用您的方法,它将如下所示:

[[* alloc] initWithFrameAndLabelArrayAndImage:frame :array :image];
Run Code Online (Sandbox Code Playgroud)

这通常是不好的做法.我会将您的自定义初始化程序重新排列为以下几行:

- (id)initWithFrame:(CGRect)frame labelArray:(NSArray *)labelArray image:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)

甚至

- (id)initWithFrame:(CGRect)frame andLabels:(NSArray *)labels andImage:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)