Objective c 自定义初始值设定项中应包含什么类型的参数?

Objective c 自定义初始值设定项中应包含什么类型的参数?,objective-c,initialization,subclass,Objective C,Initialization,Subclass,在向子类添加自定义初始值设定项时,是否有关于它应采用何种参数的规则?例如,UIView没有下面的初始值设定项有什么特别的原因吗?是否有任何理由支持而不是将其添加到UIView的自定义子类中 - (instancetype)initWithFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor; 我还没有在网上找到这个问题的答案,所以我希望你们中的一些人能给我一些启发。你可以在这里添加任何东西。但是,你可以添加这么多,它变得荒

在向子类添加自定义初始值设定项时,是否有关于它应采用何种参数的规则?例如,UIView没有下面的初始值设定项有什么特别的原因吗?是否有任何理由支持而不是将其添加到UIView的自定义子类中

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

我还没有在网上找到这个问题的答案,所以我希望你们中的一些人能给我一些启发。

你可以在这里添加任何东西。但是,你可以添加这么多,它变得荒谬

initWithFrame:backgroundColor:tintColor:alpha:hidden:userTouchEnabled:...
这实际上取决于您使用子类的目的

例如,您可以创建一个
playingcardwiew
子类。这将具有某些属性<代码>套装,
faceValue
。因为每张卡片都必须有一套套装和面值,所以将它们放入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];
}
指定的初始化器将执行卡的所有实际设置


但实际上,没有固定的方法也没有正确的方法来实现这一点,要找到最容易/最好使用的模式可能需要一段时间。

您的自定义初始值设定项可以接受您想要的任何参数。与任何其他类一样,UIView定义了一些基本行为,因此,如果您需要任何其他行为,您可以使用一个子类来自由添加它。不要抱怨UIView或任何其他类没有您认为适合它们的方法


我建议您不要编写具有许多参数的自定义初始值设定项,因为这会增加复杂性。准确地思考需要什么才能正确初始化这些类。

不,关于所需参数没有任何规则。一般来说,您可以添加任何使其易于使用的内容或必须提供的任何参数。谢谢!感谢您的详细解释。