I know bit of ts and I am new to Objective C.
I have a meeting param which I want to extend in meeting obj (MeetingConfig.h) file
@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
How can I do that? (right now I know there is redundant code)
Also, I know I am mixing language but can someone tell me what would be the equivalence of this code from Java in objective C?
MeetingConfig config = new MeetingConfig();
config.setRoomName("abc");
For now, I have made this as MeetingConfig.m file
#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
Which I am hoping is equivalent to my this file
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;
}
}
Advertisement
Answer
Just for the MeetingConfig definition, you can do something like, in 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
and, in 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
Finally, an example of using this:
#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: %sn", [config.roomName UTF8String]);
printf("authToken: %sn", [config.authToken UTF8String]);
printf("autoTone: %dn", config.autoTune);
printf("apiBase: %sn", [config.apiBase UTF8String]);
printf("showSetupScreen: %dn", config.showSetupScreen);
}
The important differences between this and what you had put together:
- Addition of the
readonlyattribute to each property, to ensure the correspondingset*methods weren’t synthesised, as they would conflict with the fluent versions - Modification to
initand setters to update the instance variables directly - Changing the signature and implementation of each setter method to return a pointer to
self, making them fluent
You’ll need to take a look a the documentation for @property, and other sources to get a sense of which attributes need to be set, I don’t have enough experience to be absolutely sure on that front.