自定义初始化程序中应该包含哪些类型的参数?

时间:2014-11-12 11:49:21

标签: objective-c initialization subclass

在为子类添加自定义初始值设定项时,是否有关于应采用何种参数的规则?举个例子,有没有一个特殊的原因,为什么UIView下面没有初始化器,并且是否有任何论据将它添加到UIView的自定义子类中?

- (instancetype)initWithFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor;

我还没能在网上找到答案,所以我希望你们中的一些人能够启发我。

2 个答案:

答案 0 :(得分:1)

您可以在其中添加任何内容。但是,你可以添加这么多,它变得荒谬......

initWithFrame:backgroundColor:tintColor:alpha:hidden:userTouchEnabled:...

这实际上取决于您使用子类的内容。

例如,您可以创建一个PlayingCardView子类。这将具有某些属性...... suitfaceValue。因为每张卡必须都有套装和面值,所以将它们放入init方法是有意义的。

因此创建一个初始化者是明智的......

- (instancetype)initWithSuit:(Suit *)suit faceValue:(FaceValue *)faceValue;

因为每张卡都必须有套装和面值。

同样地,您可以使用另一个属性backImage来设置"返回"的卡。所以你可以......

- (instancetype)initWithSuit:(Suit *)suit faceValue:(FaceValue *)faceValue backImage:(UIImage *)backImage;

现在您可以使用两个初始化程序之一。一个用于"默认"返回图像,另一个设置自定义背面图像。

然后你进入指定的初始化程序,在这种情况下,最好不要在两个init方法中重复代码,这样你就可以制作第一个这样的方法...

- (instancetype)initWithSuit:(Suit *)suit faceValue:(FaceValue *)faceValue
{
    UIImage *defaultBackImage = [UIImage imageNamed:@"defaultCardImage"];

    return [self initWithSuit:suit faceValue:faceValue backImage:defaultBackImage];
}

指定的初始化会完成卡片的所有实际设置。

实际上,没有固定的方法,没有正确的方法可以做到这一点,找到一个你最容易/最好用的模式可能需要一段时间。

答案 1 :(得分:0)

您的自定义初始值设定项可以使用您想要的任何参数。与任何其他类一样,UIView定义了一些让我们说基本行为,所以如果你需要任何其他行为,你可以自由地使用子类来添加它。不要抱怨UIView或任何其他类没有你认为对他们有好处的方法。

我建议你不要编写一个有很多参数的自定义初始化程序,因为它增加了复杂性。仔细想想正确地将这些课程所需要的内容。