【问题标题】:Allow change in property only from one specific class只允许从一个特定类别更改属性
【发布时间】:2021-09-18 12:04:19
【问题描述】:

假设我有一个类Participant,看起来像这样

Participant.h

@interface Participant : NSObject
    @property(nonatomic, readonly) NSString *name;
    @property(nonatomic, readonly) NSString *id;

@end

这里的属性是readonly,因为我不希望任何人使用这个接口来改变它

除了ParticipantManager.h

我应该在Participant 类中进行哪些更改以及如何创建ParticipantManager 以便只有ParticipantManager 可以更改Participant 的属性

更多上下文

当值发生变化时,我从react-native 收到一个事件。为了保持同步,我希望我的界面 ParticipantManager 只更改值。

#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface ParticipantManager : RCTEventEmitter <RCTBridgeModule>

@end

^^以上类应该只能更改Participant类的属性

如果用户更改值,他会调用changeName 方法,该方法会将事件发送回react-native,其中react-native 将更改值并发送回本机代码

我尝试过的。

所以,我考虑过使用类扩展概念,但出现错误。

这就是我所做的

我创建了实现 setName 方法的Participant+Private.h

#import " Participant.h" 

interface Participant() 
- (void)setName:(NSString)name
- (void)setId:(NSString)name
@end

PS:我在Participant.h中实现了setName和setId方法

- (void)setName:(NSString)name {
_name = name; 
}

但是当我在我的 ParticipantManager.h 中使用它时,它会抛出错误

Participant没有可见的@interface@声明选择器 setName

我就是这样用的

#import "Participant+Private.h"

    NSString* value = @"varun";
    [[Participant sharedInstance] setName:value];

有人可以帮我修复错误吗?

这里稍微详细的问题: No visible @interface for Participant declares the selector setName

【问题讨论】:

  • "假设我有一个 coco touch 类 Participant.h" 你没有。 Participant.h 是文件名,而不是类名; Participant 是 你的 类的名称,而不是 Cocoa Touch 类。
  • 已编辑问题:)

标签: ios objective-c iphone xcode


【解决方案1】:

Objective-C 不提供那种合理的隐私,例如“我对所有人都是私人的,除了我在此命名的另一个特定班级”。 (实际上,我不知道有什么语言可以做到这一点,但这并不是说当然没有这样的语言。)

如果这是一个框架,您可以使用@packageprivacy 将某些内容的隐私限制在同一框架中的其他类中。

否则,Objective-C 通常通过导入标头来解决可见性问题,因此如果您将 Participant 的公共访问器放入标头中,并且导入该标头的唯一类是 ParticipantManager,那么只有 ParticipantManager 可以看到它们。

【讨论】:

  • 非常感谢您的回答。我尝试使用类扩展来执行此操作,但出现错误。我已经更新了问题,你能检查一下what I have tried标题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 2022-10-14
  • 2011-04-22
相关资源
最近更新 更多