14 9月, 2016

语言基础

内容纲要

对象、属性和命令

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

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注