gpt4 book ai didi

objective-c - 在不使用访问器的情况下为继承的属性设置默认值

转载 作者:搜寻专家 更新时间:2023-10-30 20:09:04 24 4
gpt4 key购买 nike

我总是看到人们争论是否要在 -init 方法中使用属性的 setter。我的问题是如何在子类中为继承的属性创建默认值。假设我们有一个名为 NSLawyer 的类——一个我无法更改的框架类——具有如下所示的接口(interface):

@interface NSLawyer : NSObject {
@private
NSUInteger _numberOfClients;
}

@property (nonatomic, assign) NSUInteger numberOfClients;

@end

一个看起来像这样的实现:

@implementation NSLawyer

- (instancetype)init
{
self = [super init];
if (self) {
_numberOfClients = 0;
}
return self;
}

@end

现在假设我想扩展NSLawyer。我的子类将称为 SeniorPartner。由于高级合伙人应该有很多客户,所以当 SeniorPartner 被初始化时,我不希望实例以 0 开头;我希望它有 10。这是 SeniorPartner.m:

@implementation SeniorPartner

- (instancetype)init
{
self = [super init];
if (self) {

// Attempting to set the ivar directly will result in the compiler saying,
// "Instance variable _numberOfClients is private."

// _numberOfClients = 10; <- Can't do this.

// Thus, the only way to set it is with the mutator:
self.numberOfClients = 10;

// Or: [self setNumberOfClients:10];
}
return self;
}

@end

那么 Objective-C 新手应该做什么呢?嗯,我的意思是,我只能做一件事,那就是设置属性。除非我遗漏了什么。有任何想法、建议、提示或技巧吗?

最佳答案

你应该做的就是你所拥有的;调用访问器。声明类通常会避免在 init 中调用自己的访问器,以避免在可能依赖于您尚未初始化的数据的一致性的子类 中意外调用覆盖的访问器。另一方面,您的 父类(super class) 应该在子类的 init 运行时完全一致,因此此时使用父类(super class)访问器没有问题。

考虑常见的一般情况:您想在 UIView 子类中设置您的 transform。除了调用 setTransform:,你会如何解决这个问题?子类化非 Apple 代码也不异常(exception)。

关于objective-c - 在不使用访问器的情况下为继承的属性设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23946261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com