官方澳门新永利下载:中标签和函数的用法,Swift3入门教程之二

AHK 中有两种比较像的东西,标签和函数。

我的博客地址: fengqiangboy.com

标签比较简单,用来标记一段代码的位置,以 return 结束。

文档更新说明:

• 2016年10月12日 v1.0 初稿• 2016年10月13日 v2.0 增加闭包部分
Gosub, TestGoto, Test; 不再执行MsgBox, EndTest: MsgBox, Testreturn

1.1、函数的定义和调用

  • 使用func关键字来定义一个函数
  • 在swift中,大概我们也可以自豪的说”一切皆对象”了,函数也可以当做一个特殊的对象来看待。

// 定义一个不带参数的函数func sendMessage() { let message = "Hey there!" print}// 调用不带参数的函数sendMessage()/**输出结果:Hey there!*/

Test 就是一个标签。标签可以用 Gosub 调用,Gosub
执行完后会继续执行下一行。也可以用 Goto 调用,但 Goto
调用完就不会回来了。

1.2、带参数的函数

  • 定义带参数的函数,只需要在定义的时候,括号内填入相应的参数,默认情况下,是用let声明的常量
  • 在下面的定义中,func代表定义一个函数,是个关键字,sendMessage官方澳门新永利下载,是这个函数的名字,shouting是参数的名字,可在函数内部使用,在调用的时候需要声明写出来Bool代表参数类型,这里是一个布尔类型

// 定义一个带参数的函数func sendMessage(shouting: Bool) { var message = "Hey there!" if shouting { message = message.uppercased() } print}// 调用一个带参数的函数sendMessage(shouting: true)/**输出结果:HEY THERE!*/

除了使用 Gosub 或者 Goto 调用,标签还可以作为其他命令的参数,比如
Hotkey、SetTimer 等等。

1.3、函数的参数标签

  • swift中,为了使函数在调用和定义的时候都能见名知意,提供了两个命名,中间以空格分开
  • 参数名是给调用的时候函数内部使用的,参数标签是调用函数的时候,当做函数名来用的
  • 实际使用中,合理运用这两个参数,可以大大提高代码的可读性
  • 一个函数中,多个参数名不能重名,但是参数标签可以重名(建议不要那么无聊去写重名的)
  • 下面函数中“to”就是函数标签,recipientshouting是参数名
  • 不想在调用的时候写出参数标签,可以在定义函数的时候使用“_”来代替参数标签,

func sendMessage(to recipient: String, shouting: Bool) { var message = "Hey there, (recipient)!" if shouting { message = message.uppercased() } print}sendMessage(to: "Morgan", shouting: false)/**输出结果:Hey there, Morgan!*/

标签里的代码默认是执行的。比如这样一个 AHK 文件。

1.4、省略参数标签

  • 有些参数名可能会跟函数名重名,比如下面这个函数,两个message,在调用的时候就会显得特别奇怪,这时,可以用”_“来代替参数名字,调用的时候看起来就更加舒服了

// 名字优化之前func sendMessage(message: String, to recipient: String, shouting: Bool)

// 省略参数名字之后func sendMessage(_ message: String, to recipient: String, shouting: Bool) { var message = ", (recipient)!" if shouting { message = message.uppercased() } print}// 调用的时候可以省略参数名字sendMessage("See you at the Bash", to: "Morgan", shouting: false)/**输出结果:See you at the Bash, Morgan!*/
MsgBox, BeginTest: MsgBox, Testreturn

1.5、参数的默认值

  • 在上面的函数中,其实最后那个参数我们一般都是传false,这时,调用的时候再每次都写这个参数就显得多余了
  • swift中提供了一个默认参数,即可以给函数的参数一个默认值,调用的时候不传就使用默认值
  • 建议把带默认值的参数写在后面,否则,你会回来点赞的(调用的时候参数顺序看得清晰些)
  • 默认参数在定义函数的时候写在类型后面,如下:

// 参数带有默认值的函数func sendMessage(_ message: String, to recipient: String, shouting: Bool = false) { var message = ", (recipient)!" if shouting { message = message.uppercased() } print}// 调用带有默认值的函数sendMessage("See you at the Bash", to: "Morgan")/**输出结果:See you at the Bash, Morgan!*/

即使没有主动调用 Test 标签,Test 标签里的内容还是会被执行。

1.6、可变参数

  • 可变参数指的是:这个参数可以传入0个,也可以传入10000个,就像OC里面的NSLog()函数一样,后面参数个数的不定的
  • 可变参数的定义:在定义参数类型的后面加上省略号...,比如func someFunction(argumentLabel parameterName: Int...)parameterName参数就是个可变参数了
  • 可变参数的获取:在函数内部,可变参数以数组的形式体现的,上面定义的那个可变参数的获取方式parameterName[0],这样,就拿到了可变参数的第一个值

// 可变参数func optParameter(optionPara: Int...) { for num in optionPara { print }}// 调用可变参数函数optParameter(optionPara: 1, 2, 3, 4, 5)/**输出结果:12345*/

可以使用动态的标签名来调用标签。

1.7、输入输出参数(C语言中的指针参数)

  • 在C语言中,我们可以给函数传入一个指针值,以达到在函数内部修改外部参数值的目的,swift中,这种参数叫做输入输出参数
  • 定义一个输入输出参数,只需要在参数类型前面加一个inout
  • 调用的时候,需要在输入输出参数前面加”&
  • 调用的时候,输入输出参数必须传入变量,不能是常量
  • 输入输出参数不能有默认值

// 定义一个交换两数的方法func swap(a:inout Int, b:inout Int) { let c = a a = b b = c}var a = 1var b = 2print("before: a=, b=// 调用交换方法swap(&a, &b)print("after: a=, b=/**输出结果:before: a=1, b=2after: a=2, b=1*/
labelName := "Test"; IsLabel 函数用来判断标签是否存在if (IsLabel(labelName)){ Gosub, %labelName%}

1.8、函数类型

  • 回到开头,我说过,在swift中,我们也可以称为“一切皆对象”,那么,函数既然可以称之为对象,肯定有类型
  • 函数的类型:有个技巧,不管是什么类型,把参数名变量名全部删掉,剩下的就是类型了。上面的那个函数,类型就应该是(inout Int, inout Int) -> Void,解读为:这个函数类型接受两个输入输出的Int类型参数,并返回Void
  • 函数类型的使用:同其他类型一样的,上面那个函数类型就可以这样使用var function: (inout Int, inout Int) -> Void = swap
  • 同样,函数类型也可以作为函数的参数和返回值

函数作为参数的例子

// 这个函数用来作为参数func sum(num1: Int, num2: Int) -> Int { return num1+num2}// 这个函数接受一个->Int类型的函数作为参数func printResault(num1: Int, num2: Int, ruler:->Int) { // 调用传进来的函数 print(ruler(num1, num2))}// 调用函数,并把参数传进去printResault(num1: 4, num2: 5, ruler: sum)/**输出结果:9*/

函数作为返回值

// 减1func stepForward(_ input: Int) -> Int { return input + 1}// 加1func stepBackward(_ input: Int) -> Int { return input - 1}// 根据传入的backward值,返回加1函数或者减1函数func chooseStepFunction(backward: Bool) ->  -> Int { return backward ? stepBackward : stepForward}var currentValue = 3let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)// moveNearerToZero 现在指向 stepBackward() 函数。//调用返回的函数print(moveNearerToZero(currentValue))/**输出结果:2*/

函数也可以实现标签的功能,但更强大和灵活。

1.9、嵌套函数

  • 嵌套函数就是在函数里面在定义一个函数,相对的,前面说的那些都是全局函数
  • 嵌套函数只能在内部使用
Test1()Test2Test1(){ MsgBox, Test1}; 函数支持参数和返回值Test2{ MsgBox, % text return true}

2.1、什么是闭包

  • 闭包 就是“闭合包裹常量和变量的代码块”的简称,写过OC的人对OC中的
    Block 应该不会陌生,其实闭包就是swift里面的“Block”
  • 闭包是引用类型
  • 闭包的定义和函数很像,把函数的各种名称部分去掉,在用花括号括起来,其实就是一个闭包了,闭包的一般定义形式如下:

{ -> returnType in statemems}
  • in关键字表示闭包的参数和返回值类型定义完成,闭包函数体开始
  • 闭包参数可以是inout类型,但是,不能有默认参数
  • 闭包完整格式实例

let grade = [90, 100, 80, 76, 88, 65, 65, 63]print("before let grade_sort = grade.sorted (by: { (num1: Int, num2: Int) -> Bool in return num1 > num2})print("after (grade_sort)")/**输出结果:before [90, 100, 80, 76, 88, 65, 65, 63]after [100, 90, 88, 80, 76, 65, 65, 63]*/

发表评论

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