https://github.com/darknoon/cocoascript-class
Lets you create real ObjC classes in cocoascript so you can implement delegates, subclass builtin types, etc
https://github.com/darknoon/cocoascript-class
cocoascript sketch-plugin
Last synced: 12 months ago
JSON representation
Lets you create real ObjC classes in cocoascript so you can implement delegates, subclass builtin types, etc
- Host: GitHub
- URL: https://github.com/darknoon/cocoascript-class
- Owner: darknoon
- License: mit
- Archived: true
- Created: 2017-03-24T22:16:07.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2023-01-12T06:13:40.000Z (over 3 years ago)
- Last Synced: 2025-04-15T14:49:57.956Z (about 1 year ago)
- Topics: cocoascript, sketch-plugin
- Language: JavaScript
- Size: 80.1 KB
- Stars: 23
- Watchers: 3
- Forks: 8
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# cocoascript-class
Lets you create real ObjC classes in cocoascript so you can implement delegates, subclass builtin types, etc
## Installation
In your plugin, assuming you're already using an ES6 build toolchain and either `npm` or `yarn`
`npm install --save cocoascript-class` or `yarn add cocoascript-class`
## Usage
Here is an example class created with this:
````js
const MyClass = new ObjCClass({
// String values create ivar
_private: 'initial',
// This is a method on the class.
test() {
log("test: " + this._private);
},
});
// MyClass is now a real ObjC class as far as cocoascript is concerned:
const obj = MyClass.new();
// You can use setters for the ivars
obj._private = "efgh";
// And call methods
[obj test];
obj.test();
````
## Advanced
### Calling super
The `SuperCall` function will let you send a message to your superclass, equivalent to `[super myMethod]`. However, you need to tell it the types of the arguments to your function.
````js
SuperCall(sel, argumentTypes, returnType);
````
each argument or return type is just an object with `{type: encodedString}`, where encodedString is the [Objective-C type encoding](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html) of that type, for example:
````
@encode(char*) = "*"
@encode(id) = "@" // any object can use this encoding
@encode(Class) = "#"
@encode(void*) = "^v"
@encode(CGRect) = "{CGRect={CGPoint=dd}{CGSize=dd}}"
@encode(SEL) = ":"
````
Here, we call `[super description]` in our class' description method:
````js
import ObjCClass, {SuperCall} from 'cocoascript-class';
const HasDescriptionClass = new ObjCClass({
description() {
// You should cache the result of SuperCall function, don't look it up each time
if (typeof MyClass._superDesc == 'undefined') {
const sel = NSStringFromSelector('description');
MyClass._superDesc = SuperCall(sel, [], {type:"@"});
}
const superDesc = MyClass._superDesc.call(this);
return NSString.stringWithString(`${superDesc} { _private=${this._private} }`);
}
});
// MyClass is now a real ObjC class as far as cocoascript is concerned:
const obj = HasDescriptionClass.new();
log(obj); // calls description to become a string
````