class 和 objective c 中的扩展接口

class and extending interface in objective c

我懂一点 ts,我是 Objective C 的新手。

我有一个会议参数,我想在会议 obj (MeetingConfig.h) 文件中扩展它

@interface MeetingParams : NSObject
  @property (nonatomic, assign) NSString* roomName;
  @property (nonatomic, assign) NSString* authToken;
  @property (nonatomic, assign)Boolean autoTune;
  @property (nonatomic, assign)NSString* apiBase;
  @property (nonatomic, assign)Boolean showSetupScreen;
@end

@interface MeetingConfig : NSObject
@property (nonatomic, assign) NSString* roomName;
@property (nonatomic, assign) NSString* authToken;
@property (nonatomic, assign)Boolean autoTune;
@property (nonatomic, assign)NSString* apiBase;
@property (nonatomic, assign)Boolean showSetupScreen;

- (void) setAuthToken:(NSString *)authToken;
- (void) setApiBase:(NSString *)apiBase;
- (void) setShowSetupScreen:(Boolean)showSetupScreen;
- (void) setAutoTuneEnabled:(Boolean)autoTune;
- (id) init;
@end

我该怎么做? (现在我知道有冗余代码)

此外,我知道我在混合语言,但有人能告诉我 Java 中的这段代码在 objective C 中的等效项是什么吗?

 MeetingConfig config = new MeetingConfig();
        config.setRoomName("abc");

目前,我已将其制作为 MeetingConfig.m 文件

#import "MeetingConfig.h"

@implementation MeetingConfig

- (id) init
{
  if (self = [super init]) {
    self.apiBase = @"https://api.xyz.in";
    self.showSetupScreen = false;
    self.autoTune = true;
  }
  return self;
}

- (void) setAuthToken:(NSString *)authToken
{
  self.authToken = authToken;
}
- (void) setApiBase:(NSString *)apiBase
{
  self.apiBase = apiBase;
}
- (void) setShowSetupScreen:(Boolean)showSetupScreen
{
  self.showSetupScreen = showSetupScreen;
}
- (void) setAutoTuneEnabled:(Boolean)autoTune
{
  self.autoTune = autoTune;
}

@end

我希望它等同于我的这个文件

package com.dyteclientmobile;

public class MeetingConfig {
    public String roomName;
    public String authToken;
    public boolean autoTune;
    public String apiBase;
    public boolean showSetupScreen;

    public MeetingConfig() {
        this.apiBase = "https://api.xyz.in";
        this.showSetupScreen = false;
        this.autoTune = true;
    }

    public MeetingConfig setRoomName(String roomName) {
        this.roomName = roomName;
        return this;
    }

    public MeetingConfig setAuthToken(String authToken) {
        this.roomName = roomName;
        return this;
    }

    public MeetingConfig setApiBase(String apiBase) {
        this.apiBase = apiBase;
        return this;
    }

    public MeetingConfig setShowSetupScreen(boolean showSetupScreen) {
        this.showSetupScreen = showSetupScreen;
        return this;
    }

    public MeetingConfig setAutoTuneEnabled(boolean autoTune) {
        this.autoTune = autoTune;
        return this;
    }
}

仅针对 MeetingConfig 定义,您可以在 MeetingConfig.h 中执行类似操作:

#import <Foundation/Foundation.h>

@interface MeetingConfig : NSObject

@property(nonatomic, assign, readonly) NSString *roomName;
@property(nonatomic, assign, readonly) NSString *authToken;
@property(nonatomic, assign, readonly) BOOL autoTune;
@property(nonatomic, assign, readonly) NSString *apiBase;
@property(nonatomic, assign, readonly) BOOL showSetupScreen;

- (id)init;
- (MeetingConfig *)setAuthToken:(NSString *)authToken;
- (MeetingConfig *)setRoomName:(NSString *)roomName;
- (MeetingConfig *)setApiBase:(NSString *)apiBase;
- (MeetingConfig *)setShowSetupScreen:(BOOL)showSetupScreen;
- (MeetingConfig *)setAutoTuneEnabled:(BOOL)autoTune;

@end

并且,在 MeetingConfig.m 中:

#import "MeetingConfig.h"

@implementation MeetingConfig

- (id)init {
  if (self = [super init]) {
    _apiBase = @"https://api.xyz.in";
    _showSetupScreen = false;
    _autoTune = true;
  }
  return self;
}

- (MeetingConfig *)setAuthToken:(NSString *)authToken {
  _authToken = authToken;
  return self;
}

- (MeetingConfig *)setRoomName:(NSString *)roomName {
  _roomName = roomName;
  return self;
}

- (MeetingConfig *)setApiBase:(NSString *)apiBase {
  _apiBase = apiBase;
  return self;
}

- (MeetingConfig *)setShowSetupScreen:(BOOL)showSetupScreen {
  _showSetupScreen = showSetupScreen;
  return self;
}

- (MeetingConfig *)setAutoTuneEnabled:(BOOL)autoTune {
  _autoTune = autoTune;
  return self;
}

@end

最后,一个使用这个的例子:

#import "MeetingConfig.h"

void printConfig(MeetingConfig *);

int main(int argc, char **argv) {
  MeetingConfig *config = [[MeetingConfig alloc] init];
  printConfig(config);
  [[[config setRoomName:@"abc"] setAuthToken:@"def"] setApiBase:@"http://localhost:8080"];
  printConfig(config);
}

void printConfig(MeetingConfig *config) {
  printf("roomName:         %s\n", [config.roomName UTF8String]);
  printf("authToken:        %s\n", [config.authToken UTF8String]);
  printf("autoTone:         %d\n", config.autoTune);
  printf("apiBase:          %s\n", [config.apiBase UTF8String]);
  printf("showSetupScreen:  %d\n", config.showSetupScreen);
}

这与您放在一起的内容之间的重要区别:

  • 为每个 属性 添加 readonly 属性,以确保不会合成相应的 set* 方法,因为它们会与流畅的版本发生冲突
  • 修改 init 和 setters 以直接更新实例变量
  • 将每个 setter 方法的签名和实现更改为 return 指向 self 的指针,使它们流畅

您需要查看 documentation for @property, and other sources 以了解需要设置哪些属性,我没有足够的经验在这方面绝对确定。