Skip to content
This repository was archived by the owner on Feb 6, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,40 @@ const obj = HasDescriptionClass.new();
log(obj); // calls description to become a string
````

### Setting your superclass

The `superclass` property lets you set your superclass, equivalent to `@interface myClass : superclass`. Here, we subclass `NSView` and create a square view:

````js
import ObjCClass from 'cocoascript-class'

const ViewClass = new ObjCClass({
superclass: NSView
});

const view = ViewClass.new();
// call inherited methods
view.setFrame(NSMakeRect(0, 0, 100, 100));
````

If not set, the superclass is `NSObject`.

### Adding class methods

The `classMethods` property lets you add class methods similar to how instance methods are added. Here is an example:

````js
import ObjCClass from 'cocoascript-class'

const HasClassMethodsClass = new ObjCClass({
classMethods: {
test() {
log("test");
}
}
});

// call methods on the class
[HasClassMethodsClass test];
HasClassMethodsClass.test();
````
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cocoascript-class",
"version": "0.1.2",
"version": "0.2.0",
"description": "Lets you create real ObjC classes in cocoascript so you can implement delegates, subclass builtin types, etc",
"main": "lib/index.js",
"repository": "https://github.com/darknoon/cocoascript-class",
Expand Down
12 changes: 10 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ const SuperInit = SuperCall(NSStringFromSelector("init"), [], {type:"@"});
export default function ObjCClass(defn) {
const superclass = defn.superclass || NSObject;
const className = (defn.className || defn.classname || "ObjCClass") + NSUUID.UUID().UUIDString()
const reserved = new Set(['className', 'classname','superclass']);
const classMethods = (defn.classMethods || defn.classmethods || {})
const reserved = new Set(['className', 'classname','superclass', 'classMethods', 'classmethods']);
var cls = MOClassDescription.allocateDescriptionForClassWithName_superclass_(className, superclass)
// Add each handler to the class description
const ivars = [];
Expand All @@ -25,6 +26,14 @@ export default function ObjCClass(defn) {
cls.addInstanceVariableWithName_typeEncoding(key, "@");
}
}
// Add each class method to the class description
for(var key in classMethods) {
const v = classMethods[key]
if (typeof v == 'function') {
var selector = NSSelectorFromString(key)
cls.addClassMethodWithSelector_function_(selector, v);
}
}

cls.addInstanceMethodWithSelector_function_(NSSelectorFromString('init'), function() {
const self = SuperInit.call(this);
Expand All @@ -48,4 +57,3 @@ function getIvar(obj, name) {
object_getInstanceVariable(obj, name, retPtr);
return retPtr.value().retain().autorelease();
}