AppleScript and Swift — Part 2. Passing parameters.
Learn about AppleScript functions, actual and formal parameters, and NSAppleEventDescriptor — The holy grail.
Okay, so in part 1 I only had to pass variables from Swift to AppleScript, but I didn’t have to edit the variables. Well, I thought that the variables are editable once passed into AppleScript. I thought wrong. 😓
So, here’s what happens when you pass Swift or Objective-C variables (Int, NSInteger, String, NSString, blah blah) to AppleScript.
You can pass Swift or Obj-C variables to AppleScript and access them and output them to the console without breaking a sweat, like in part 1. 👍🏼 The problem arises when you want to edit them. Let’s say you’re passing an
2 from Swift to AppleScript. AppleScript understands that you’ve passed an
Int, but this
Int is a Swift data type and not an AppleScript data type. So, when you try to modify the variable or use it in an equation therein the problem occurs. AppleScript does not implicitly convert this Swift data type to an AppleScript data type.
How do we fix this?
After over 24 hours of trying to understand why my code wasn’t working. With only a very vague
missing value error when I tried to add a Swift passed parameter —
2 with an AppleScript
Integer. I remembered looking at
NSAppleEventDescriptor someday. So I started to read on up on it.
NSAppleEventDescriptoris the basic building block for Apple events.
NSAppleEventDescriptorclass is a wrapper for the underlying Apple event descriptor data type,
An instance of
NSAppleEventDescriptorcan represent any kind of descriptor, from a simple value descriptor, to a descriptor list, to a full-fledged Apple event.
If already haven’t figured it out. We use
NSAppleEventDescriptor to create values of AppleScript data type, i.e., the AppleScript data type equivalent of
String, and so on…
NSAppleEventDescriptor(string: "Hello AppleScript")
There are 2 ways to write functions in AppleScript: the Objective-C style and the Classic AppleScript style.
Classic AppleScript style:
Read this guide for better understanding.
We’re going to use Objective-C style parameters.
Let’s say you want to pass a
NSAppleEventDescriptor instance for the string.
let param1 = NSAppleEventDescriptor(string: "Hello AppleScript")
Now, in your AppleScript Protocol that you’ve defined use
NSAppleEventDescriptor as your data type.
Refer part 1 if you’re confused on how to connect AppleScript and Swift.
func doSomething(_: NSAppleEventDescriptor) -> NSString
Now, all there’s left to do is (booty) call your function!
let returnVal = doSomething(param1)