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
readonly
attribute to each property, to ensure the correspondingset*
methods weren’t synthesised, as they would conflict with the fluent versions - Modification to
init
and 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.