Using Swift to Call Objective C Code
Swift is a new programming language that is purely compatible with objective C. This makes it possible to use objective C file code in Swift file. Apple claims the co-existence […]
In this post we will learn the basics of how to use CocoaSpirit for interacting with Objective-C. Let us consider the following example.
Example of Objective-C class
@interface Object1 : NSObject
@property id value1;
@property NSArray *array1;
– (void)selector1;
– (void)selector2:(id)arg1 withArg2:(id)arg2;
@end
Basic Syntax
There are two approach of interacting with objective-C class
//Style One Mocha Javascript style
var object = Object1.alloc().init()
var value1 = object.value1()
var item1 = object.array().first()
object.selector1()
object.selector2_withArg2_(arg1, arg2)
// Style Two CocoaScript Objective-C Bracket
var object = [[Object1 alloc] init]
var value1 = [object value1]
var item1 = [[object array] first] [object selector1]
[object selector2:arg1 withArg2:arg2]
It is to be noted that “bracket syntaxes” will work for Cocoa objects but not with Javascript objects.
Array
// Objective-C
NSMutableArray *array = [NSMutableArray array]
[array addObject:@1];
[array addObject:@2];
Array access is very straight forward although you won’t be able to implement the for…in loop in Objective-C arrays:
for (var i = 0; i < array.length; i++) {
var item = array[i]
log(item)
}
Dictionary
// Objective-C
NSDictionary *dict = @{ @”key1″: @”value1″, @”key2″: @”value2″ };
It is as easy as in case of Objective-C
dict[“key1”]
Target Action
There’ll be cases where you are required to implement action handler for NSButton. Now we will use the class COSTarget of CocoaScript framework.
var okButton = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]
var userClickedOK = false
[okButton setCOSJSTargetFunction:function(sender) {
userClickedOK = true
}];
Blocks
An easy example of completion handler to implement:
typedef void(^CompletionHandler)(BOOL);
@interface Object2 : NSObject
– (void)completionHandler:(CompletionHandler)handler;
@end
Use the following code to implement it
var object2 = Object2.alloc().init() object2.completionHandler(function(success) {
log(“success: ” + success)
});
Delegate
Using WebFrameLoadDelegate inside OSX as an example:
@interface NSObject (WebFrameLoadDelegate)
– (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame;
@end
Using MochaJSDelegate, we will create a dynamic instance for callback handling.
@import ‘MochaJSDelegate.js’
// Make sure the object’s lifecycle is there
COScript.currentCOScript().setShouldKeepAround_(true);
// Create a WebView
var webView = WebView.new();
// Create a delegate
var delegate = new MochaJSDelegate()
// Configure the handler
delegate.setHandlerForSelector(“webView:didFinishLoadForFrame:”, function(webView, webFrame){
var app = [NSApplication sharedApplication];
[app displayDialog:”WebView Loaded!” withTitle:”Success!”];
});
// Set WebView’s frameLoadDelegate
webView.setFrameLoadDelegate_(delegate.getClassInstance());
webView.setMainFrameURL_(“http://google.com/”);
Subclass
Subclass is somewhat tricky just like implementing the delegate pattern.
// Class.js var
Class = function(className, BaseClass, selectorHandlerDict) {
var uniqueClassName = className + NSUUID.UUID().UUIDString();
var delegateClassDesc = MOClassDescription.allocateDescriptionForClassWithName_superclass_(uniqueClassName, BaseClass);
for (var selectorString in selectorHandlerDict) {
delegateClassDesc.addInstanceMethodWithSelector_function_(selectorString, selectorHandlerDict[selectorString]);
}
delegateClassDesc.registerClass();
return NSClassFromString(uniqueClassName);
};
Creation of subclass is done as below:
@import ‘Class.js’
var Dog = Class(“Dog”, NSObject, {
“method1”:function() { log(“method1 called”) },
“method2:andArg2:”:function(arg1, arg2) { log(“method2 called. arg1 = ” + arg1 + ” arg2 = ” + arg2) }
})
var dog = Dog.alloc().init()
[dog method1]
[dog method2:”bark” andArg2:”wow”]
Pointers
In case of few methods working with pointers is required
@interface MyClass : NSObject
– (CGFloat)getWidthOfRect:(const NSRect *)rect;
@end
We’ll need to use the MOPointer class in Mocha.
var rect = NSMakeRect(0.0, 0.0, 100.0, 100.0)
var ptr = MOPointer.alloc().initWithValue_(rect); myObject.getWidthOfRect_(ptr); >>> 100.0;
Looking forward to respond to your queries and comments regarding approach to fix WordPress security issues. We’ve covered all the essential syntax for CocoaScript
About Singsys Pte. Ltd. Singsys is a solution provider that offer user friendly solution on cutting edge technologies to engage customers and boost your brand online results from a set of certified developers, designers who prefer optimized utilization of the available resources to align client’s idea with their skillset to reflect it into a Mobile application, Web application or an E-commerce solution
You may be interested in following:
May 1st, 2017
Swift is a new programming language that is purely compatible with objective C. This makes it possible to use objective C file code in Swift file. Apple claims the co-existence […]