对象、属性和命令
AppleScript是一种面向对象(Object-Oriented,简称OO)的脚本语言,和现在主流的面向对象程序语言一样,它拥有三个重要的OO术语:对象(Object)、属性(Property)和命令(Command)。
- 对象:又称“类”(Class),在生活中即一个具体的物体---汽车本身,当然也可以是一个部件,如轮子、车门、引擎---这三者作为汽车的一个组成部分,在OO概念里被称为子类。请记住:对象(类)是有可以拥有层次关系的。
- 属性:是对象的特性。如:汽车的颜色、车身长度、重量等都是对象汽车的属性。一个对象如果没有具体的属性,那么它将是抽象的或者是笼统的。
- 命令:又称“方法”(Method)。顾名思义,命令就是指令,它告诉脚本/程序应该去做什么。在非面向对象(面向过程)的语言中,命令或者方法可被称为“函数”。
标识符和关键字
AppleScript采用Unicode文字编码,并且不区分大小写。
标识符(Identifier)
标识符就是对象、属性、常亮、变量等等的名称。就像人的姓名一样。 AppleScript规定:标识符必须以英语字母开头,可使用26个英语字母、10个阿拉伯数字以及下划线(_)。
特殊规则:如果标识符以“|”开头并结尾,则标识符可以使用任何Unicode字符,但是标识符名称本身是不包括“|”。
- 合法的标识符: abcd、ABC_91、a0abc、|a&b*c|、|中文|
- 不合法标识符:
91abc、_abc、中文名称、a&b*c
关键字(Keyword)
关键字就是AppleScript保留的标识符,这些词通常拥有特殊含义(如被用于AppleScript语法),它们不能被用户定义为自己的标识符。
下表列出了常见关键字:请注意部分关键字由两个词组成。
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
about | back | considering | end | fourth |
above | before | contain | equal | from |
after | beginning | contains | equals | front |
against | behind | contains | error | get |
and | below | continue | every | given |
apart from | beneath | copy | exit | global |
around | beside | div | false | if |
as | between | does | fifth | ignoring |
aside from | but | eighth | first | in |
at | by | else | for | instead of |
into | not | reference | tell | transaction |
is | of | repeat | tenth | true |
it | on | return | that | try |
its | onto | returning | the | until |
last | or | script | then | where |
local | out of | second | third | while |
me | over | set | through | whose |
middle | prop | seventh | thru | with |
mod | property | since | timeout | without |
my | put | sixth | times | ninth |
ref | some | to |
数据类型
数据类型(Data Type 或者 Value Class)可以由AppleScript语言本身定义,也可以是由应用程序定义的。在AppleScript常见的有以下几种:
- Boolean(布尔型) 仅仅包含两个值:True 和 False。
- Number(数字型)、Integer(整型)、Real(实型) 如:1,2,1.0,1.1,3.14,-1.56。
- Text(文本型)、String(字符串型) 如:"This is a text"。 注意:引号为英文引号
- Date(日期型) 如:date "2019年8月30日 星期日 下午12:31:31"。此格式的具体形式由“系统偏好设置-语言和文本”的相关设置决定
- Constant(常量型) 如: yes、no、ask。 这些常量可以是已经被AppleScript预定义的,也可以是用户定义的不可变变量。这种类型的数据一经确定不可更改。此外可以认为所有关键字都是常量型的数据。
- List(列表型) 如:{1,2,3}、{{1,2},{a,b,c},}、{1,1.9,"text"}。列表型数据由{}包裹,一个列表中可以再包含列表,形成多维列表,列表里的具体数据可以是同类型的。
- Record(记录型) 如:{firstName:"iDoraemon",lastName:"Nathan"}。 记录就是带有名称的列表。记录中的每一项都有名称(标识符)。我们可以认为List是每个数据都是匿名的Record。Record也可以进一步包含另一个Record。
此例中,包含两个Text型数据"iDoraemon"和"Nathan",他们的标识符分别是firstName和lastName。通过of关键字可以得到想要数据:firstName of {firstName:"iDoraemon",lastName:"Nathan"}
上面这行代码返回"iDoraemon"。
确定数据类型-Class of
要确定一个数据到底是什么类型的,使用Class of语句:
class of "string"
此代码得到结果:text。
强制数据类型转换
有时默认的数据类型并不是我们想要的,比如“1”的数据类型为Text,而我们想要的时Integer;另一个例子是命令要求的参数类型与实际类型不一致时,我们就需要强制类型转换(Coercion)。
as关键字
用as关键字即可实现强制类型转换。
用法: 数据 as 类型
请注意:强制类型转换有时会丢失精度。
--文本类型转数字类型
"1.99" as real --得到Real类型的1.99,而原来的数据是Text(因为带有引号)
"1.99" as integer --得到Integer类型的2,精度丢失!
"1" as real --得到Real类型的1.0,自动提升精度!
--转换成List类型
"text" as list --得到{"text"}
1.99 as list --得到{1.99}
{a:1,b:2} as list --得到{1,2},精度丢失(标识符丢失)!
--错误举例
"text2" as number --错误! Text中包含了无法转换成数字的字符。
1 as record --错误! 无法获得标识符。
{1,2} as record --错误! 无法获得标识符。
运算符
数学运算符(常见七种)
运算符 | 含义 | 举例 | 运算符 | 含义 | 举例 |
---|---|---|---|---|---|
+ | 数学+ | 1+1 返回2 | ^ | 指数运算符 a^b | 3^2 返回9.0 |
- | 数学- | 2-1 返回1 | div | 整除,舍弃余数 | 5 div 2 返回2 |
* | 数学x | 2*3 返回6 | mod | 除法取余数 | 5 mod 2 返回1 |
/或÷ | 数学÷ | 3/2 返回1.5 |
AppleScript对除法的运算过程和代数学一样,不会出现其他编程语言中3/2=1的情况,AppleScript更贴近实际生活,请不要和其他编程语言混淆。
比较运算符
下表中所有运算符均返回Boolean(布尔型)数值。 同一个格子的运算符中是同一功能的不同表达方式。从表格中不难看出,AppleScript在设计的时候的确很用心,语言很接近英语。
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
=
equals is equal [is] equal to |
比较两端是否相同
支持的数据类型非常多 |
≠
is not isn't isn't equal [to] is not equal [to] doesn't equal does not equal |
比较两端是否不同
支持的数据类型非常多 |
>
[is] greater than comes after is not less than or equal [to] isn't less than or equal [to] |
左边是否数值大于/文本长于/时间晚于右边
支持类型:integer、real、date、text |
≥
>= [is] greater than or equal is not less than isn't less than does not come before doesn't come before |
左边是否数值大于/文本长于/时间晚于或等于右边
支持类型:integer、real、date、text |
<
[is] less than comes before is not greater than or equal [to] isn't greater than or equal [to] |
左边是否数值小于/文本短于/时间早于右边
支持类型:integer、real、date、text |
≤
<= [is] less than or equal is not greater than isn't greater than does not come after doesn't come after |
左边是否数值小于/文本短于/时间早于或者等于右边
支持类型:integer、real、date、text |
start[s] with
begin[s] with |
前者是否以后者为开始
支持text和list |
end[s] with | 前者是否以后者为结束
支持text和list |
contain[s] | 前者中是否包含后者这一元素
支持text、list、record类型 |
does not contain
doesn't contain |
前者中是否不含后者这一元素
支持text、list、record类型 |
is in
is contained by |
后者中是否包含前者这一元素
支持text、list、record类型 |
is not in
is not contained by isn't contained by |
后者中是否不含前者这一元素
支持text、list、record类型 |
比较运算符表达方式非常多样,应该根据自己的实际情况选择一种或几种
逻辑运算符
and(逻辑与)、or(逻辑或)、not(逻辑非),三个对参与运算的数据要求均为Boolean型,not为单目运算符。
& 运算符
简单来说,这个是合并运算符。支持任何类型数据。 记住“&”运算符的三个规则:
- “&”左边的数据类型为Text(文本型)时,结果为Text;存在报错可能;
- “&”左边的数据类型为Record(记录型)时,结果为Record;存在报错可能;
- “&”左边的数据类型为其他时,结果为List类型。
"Text" & 1 --结果:“Text1”(Text类型) 1 & "Text" --结果:{1,“Text”}(List类型) {name:"a"} & "b" --结果:{name:"a",<<class ktxt>>:"b"(Record类型,第二个元素匿名) 3 & {name:"a"} --结果:{3,"a"}(List类型,且丢失标识符) {1,2,3} & {4,5,6} --结果:{1,2,3,4,5,6}(List类型-一维的) {1,2,3} & 4 & 5 & 6 --结果:同上 {a:1,b:2} & {c:3} --结果:{a:1,b:2,c:3}(Record类型-一维的) -----错误举例 "Text" & {name:"a"} --错误!无法将Record类型数据转为文本 {name:"a"} & 3 --错误!无法将Integer转换为Record
提取对象中的元素
提取字符串中的字母或单词
提取字符串中全部字母(单个Unicode字符),结果为List类型
every character of "一个字符串" --结果:{"一","个","字","符","串"}每个字符
characters of "A String" --结果:{"A"," ","S","t","r","i","n","g"}每个字符
请注意:every character of 和 characters of 两个命令的功能完全一致。
提取字符串中全部单词,结果为List类型
words of “A string” --结果:{"A","string"}
every word of "我的名字叫张三" --结果:{"我","的","名字","叫","张三"}
every word of 和 words of 功能也完全一致。
提取指定未知的几个字符或单词,结果为List类型;提取特定位置的一个字符或单词,结果为Text。
characters 3 through 5 of "A String" --结果:{"S","t","r"} (几个字符--List)
words 3 through 5 of "我的名字叫张三" --结果:{"名字","叫","张三"} (几个单词--List)
word 2 of "This is a text" --结果:"is" (一个单词--Text)
character 3 of "This is a text" --结果:"i" (一个字符--Text)
ninth character of "This is a text" --结果:"a",AppleScript还能识别序数词。
特别注意:
- 第一个字符的位置是1,而不是0!
- "through"可以缩写为“thru”
- 不推荐用序数词方法获得一个单词或字符
- 不推荐对于中文引用“word”相关语句
提取Finder文件列表
用提取字符串中字母的思想,现在来提取Finder文件列表。 示例代码:
tell application "Finder"
every file of desktop --获得桌面上所有文件(List类型),其内容很详细
files of desktop --同上
every folder of desktop --获得桌面上所有文件夹(List类型),其内容很详细
folers of desktop --同上
name of every file of desktop --结果:获得桌面上所有文件名称(List类型)
end tell
提取符合指定条件的Finder文件列表:
tell application "Finder"
every file of desktop whose name begins with "a" --仅获得文件名以a开头的文件列表
every file of desktop where its name contains "a" --仅获得文件名包含a的文件列表
end tell
添加注释和括号
所谓注释,就是写在代码里但不会被执行的文字,通常用于辅助说明代码功能。
行尾注释(End-of-line comment)
以“--”(两个连字符,不含引号)开头,--之后的内容全部为注释,而之前的内容仍然为会被执行的代码,仅对当前一行有效! 在前面的代码示例中,我们就采用了这种注释方法。
块注释(Block comment)
以“(*” 开头,并以“*)”结尾(括号加上星号,均不含引号);包含在里面的所有文字均视为注释,可以跨行,也可以在一行中间位置。
给代码添加括号
由于代码执行的优先级问题,可能导致代码未按照预期执行,那么此时加上括号来强制控制运算优先级将很必要。 更重要的是,对于复杂的代码的,不管默认优先级如何,总加上括号来明确是个好习惯!
代码缩写
为了节省时间,将冗长的关键字缩写为几个字母也是非常有用的。示例:
- application 简写为 app (编译时会补全)
- end tell/repeat/try 简写为 end (编译时会补全)
- through 简写为 thru
- if语句 可省略 then