AppleScript学习笔记(六)处理程序Handler

进入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()

AppleScript学习笔记(六)处理程序Handler


局部变量的命名和外部变量的命名无冲突,修改同名的局部变量的值对外部变量无影响。例如:

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

AppleScript学习笔记(六)处理程序Handler


第一个解决方法是将本文件声明的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文件:

AppleScript学习笔记(六)处理程序Handler


结果区输出:314.159265358979


注意这里选择的必须是.scpt格式的脚本文件,如果选择了.app的脚本应用程序也是无效的。


更多详细内容请参考《AppleScript for Absolute Starters》一书(中文名为《苹果脚本跟我学》)。


AppleScript学习笔记(六)处理程序Handler,布布扣,bubuko.com

AppleScript学习笔记(六)处理程序Handler

上一篇:android 快捷键


下一篇:Android开发学习之Xml解析归纳