进入AS4AS书中的最后一章了,本章说的处理程序Handler类似于OC中的方法。什么增加代码复用性和提高开发效率之类的在这里就不说了。
定义和调用Handler
定义Handler的方法如下:
on Handler名(参数列表) ... return 返回值 end Handler名
调用Handler方法:
Handler名(传递的参数列表)
只要Handler在脚本中定义了,那么可以在Handler定义的前面或后面调用。
使用举例:
(1)无参数的Handler:
warnFunc() on warnFunc() display dialog "Warning!!!" buttons {"OK"} default button "OK" end warnFunc warnFunc()
以上的warnFunc()可以在Handler定义前后分别使用。
(2)带参数的Handler:
on callDialogWithText(textToDisplay) display dialog textToDisplay buttons {"OK"} default button "OK" end callDialogWithText -- callDialogWithText("Hello") set programLanguage to some item of {"C++", "OC", "Java", "JSP", "AppleScript"} callDialogWithText(programLanguage)
(3)带返回值的Handler:
on circleArea(radius) set area to pi * (radius ^ 2) return pi * (radius ^ 2) end circleArea set anArea to circleArea(10)
结果输出为:314.159265358979
(4)返回多个值的Handler:
如果在一个Handler中返回多个值,那么就返回一个列表或记录。例如:
-- return a list on circleCalculations(radius) set area to pi * (radius ^ 2) set circumference to 2 * pi * radius return {area, circumference} end circleCalculations set circleProperties to circleCalculations(10) -- return a record on circleCalculations2(radius) set area to pi * (radius ^ 2) set circumference to 2 * pi * radius return {areaName:area, circumName:circumference} end circleCalculations2 set circleArea to the areaName of circleCalculations2(10.0)
需要注意的是在Handler中使用的变量都是局部变量,不能使用外部的变量,其命名也不会和外部的变量造成冲突。
例如:
在Handler中使用外部变量,在运行时将会报错:
set x to 1 on renameTest() return x * 5 end renameTest set y to renameTest()
局部变量的命名和外部变量的命名无冲突,修改同名的局部变量的值对外部变量无影响。例如:
set x to 1 on renameTest() set x to 2 return 10 end renameTest set y to renameTest() get x
结果输出为:1
(5)在其他程序中调用本文件的Handler
在其他应用程序中调用本文件的Handler,如果没有作一些处理将会报错,例如:
on warnFunc() display dialog "Warning!!!" buttons {"OK"} default button "OK" end warnFunc tell application "Finder" warnFunc() empty the trash end tell
第一个解决方法是将本文件声明的Handler独立出来:
on warnFunc() display dialog "Warning!!!" buttons {"OK"} default button "OK" end warnFunc warnFunc() tell application "Finder" empty the trash end tell
明显不够好,破坏代码的结构性,第二个解决方法是用of me标记这个Handler:
on warnFunc() display dialog "Warning!!!" buttons {"OK"} default button "OK" end warnFunc tell application "Finder" warnFunc() of me empty the trash end tell
load script
既然可以将一些可复用的代码抽离成一个方法,那么当然也可以将一些可复用的方法抽离到一个文件中,并供其他脚本调用了。这类似于OC中的导入头文件,然后调用文件给出的接口。
要调用一个文件中的方法,首先要导入该文件,然后让该脚本去执行我们想要调用的Handler:
set 要加载的脚本 to (load script 脚本文件路径) tell 要加载的脚本 ... 调用Handler end tell
使用举例:
以下是要调用的脚本文件AreaCalculation.scpt中的代码:
on circleArea(radius) set area to pi * (radius ^ 2) return pi * (radius ^ 2) end circleArea
以下是调用示例的文件LoadScript.scpt中的内容:
set scriptPath to choose file try set areaCalScript to (load script scriptPath) tell areaCalScript try set area to circleArea(10.0) on error display dialog "没有找到对应的方法" end try end tell on error display dialog "请选择一个脚本文件" end try
在运行程序时选择AreaCalculation.scpt文件:
结果区输出:314.159265358979
注意这里选择的必须是.scpt格式的脚本文件,如果选择了.app的脚本应用程序也是无效的。
更多详细内容请参考《AppleScript for Absolute Starters》一书(中文名为《苹果脚本跟我学》)。