gpt4 book ai didi

objective-c - 阻止 API 用户设置属性的属性

转载 作者:行者123 更新时间:2023-12-03 16:35:49 26 4
gpt4 key购买 nike

我想阻止我的 Objective-C 对象之一的用户设置该对象的属性的属性。就像不可能设置 UIViewframeorigin 一样。我需要这个的原因完全相同:能够管理属性 setter 上的一些副作用。

示例:

@interface Time : NSObject
@property (nonatomic) NSInteger hours;
@property (nonatomic) NSInteger minutes;
@end

@interface Watch : NSObject
@property (nonatomic) Time *time;
@end

现在应该不可能通过调用直接设置分钟:

watch.time.minutes = 15;

…而不是:

Time *time = watch.time; // [watch.time copy]?
time.minutes = 15;
watch.time = time; // Here, in setTime:, I can implement some side effects

当尝试设置 UIView frame 的大小时,编译器会这样提示:“表达式不可分配”。苹果的框架开发人员怎么能做到这一点呢?这只能用结构来完成吗?我怎样才能实现类似的目标?

最佳答案

我看到几个选项:

通过从 getter 中返回 time副本来完全禁止更改。您必须记录发生这种情况的事实,这可能违反最小意外原则。

使用 KVO 允许 Watch 实例对其 Time 成员已修改这一事实使用react。只要修改通过 Time 的 setter(在这种情况下必须如此),Watch 就可以在 observeValueForKeyPath 中执行它需要执行的操作: ofObject:更改:上下文:

最后,考虑 Time 是否需要是可变的。也许您这里的代码只是一个示例,但 Time 似乎是一种值类型。一般来说,在 Cocoa 中,这些是不可变的。将您不想修改的 Time 属性更改为 readonly 将为您和 API 用户完美解决这个问题。

关于objective-c - 阻止 API 用户设置属性的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24766141/

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