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 以了解需要设置哪些属性,我没有足够的经验在这方面绝对确定。
我懂一点 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 以了解需要设置哪些属性,我没有足够的经验在这方面绝对确定。