iOS程序猿iOS学习笔记iOS Developer

Swift3入门教程之二----函数和闭包

2016-10-12  本文已影响458人  奉强

我的博客地址: fengqiangboy.com

文档更新说明:

•   2016年10月12日 v1.0 初稿
•   2016年10月13日 v2.0 增加闭包部分

1、函数

1.1、函数的定义和调用

// 定义一个不带参数的函数
func sendMessage() {
   let message = "Hey there!"
   print(message)
}

// 调用不带参数的函数
sendMessage()

/**
输出结果:
Hey there!
*/

1.2、带参数的函数

// 定义一个带参数的函数
func sendMessage(shouting: Bool) {
   var message = "Hey there!"
   if shouting {
      message = message.uppercased()
   }
   print(message)
}

// 调用一个带参数的函数
sendMessage(shouting: true)


/**
输出结果:
HEY THERE!
*/

1.3、函数的参数标签

func sendMessage(to recipient: String, shouting: Bool) {
   var message = "Hey there, \(recipient)!"
   if shouting {
      message = message.uppercased()
   }
   print(message)
}

sendMessage(to: "Morgan", shouting: false)


/**
输出结果:
Hey there, Morgan!
*/

1.4、省略参数标签

// 名字优化之前
func sendMessage(message: String, to recipient: String, shouting: Bool)
// 省略参数名字之后
func sendMessage(_ message: String, to recipient: String, shouting: Bool) {
   var message = "\(message), \(recipient)!"
   if shouting {
      message = message.uppercased()
   }
   print(message)
}

// 调用的时候可以省略参数名字
sendMessage("See you at the Bash", to: "Morgan", shouting: false)

/**
输出结果:
See you at the Bash, Morgan!
*/

1.5、参数的默认值

// 参数带有默认值的函数
func sendMessage(_ message: String, to recipient: String, shouting: Bool = false) {
   var message = "\(message), \(recipient)!"
   if shouting {
      message = message.uppercased()
   }
   print(message)
}

// 调用带有默认值的函数
sendMessage("See you at the Bash", to: "Morgan")

/**
输出结果:
See you at the Bash, Morgan!
*/

1.6、可变参数

// 可变参数
func optParameter(optionPara: Int...) {
    for num in optionPara {
        print(num)
    }
}

// 调用可变参数函数
optParameter(optionPara: 1, 2, 3, 4, 5)


/**
输出结果:
1
2
3
4
5
*/

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

// 定义一个交换两数的方法
func swap(a:inout Int, b:inout Int) {
    let c = a
    a = b
    b = c
}

var a = 1
var b = 2

print("before: a=\(a), b=\(b)")

// 调用交换方法
swap(&a, &b)

print("after: a=\(a), b=\(b)")

/**
输出结果:
before: a=1, b=2
after: a=2, b=1
*/

1.8、函数类型

函数作为参数的例子

// 这个函数用来作为参数
func sum(num1: Int, num2: Int) -> Int {
    return num1+num2
}

// 这个函数接受一个(Int, Int)->Int类型的函数作为参数
func printResault(num1: Int, num2: Int, ruler:(Int, Int)->Int) {
     // 调用传进来的函数
    print(ruler(num1, num2))
}

// 调用函数,并把参数传进去
printResault(num1: 4, num2: 5, ruler: sum)

/**
输出结果:
9
*/

函数作为返回值

// 减1
func stepForward(_ input: Int) -> Int {
    return input + 1
}
// 加1
func stepBackward(_ input: Int) -> Int {
    return input - 1
}

// 根据传入的backward值,返回加1函数或者减1函数
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}

var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero 现在指向 stepBackward() 函数。

//调用返回的函数
print(moveNearerToZero(currentValue))

/**
输出结果:
2
*/

1.9、嵌套函数

2、闭包

2.1、什么是闭包

{(params) -> returnType in 
    statemems
}
let grade = [90, 100, 80, 76, 88, 65, 65, 63]

print("before \(grade)")

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]
*/

2.2闭包格式大简化

let grade = [90, 100, 80, 76, 88, 65, 65, 63]

print("before \(grade)")

let grade_sort = grade.sorted { (num1, num2) 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]
*/

let grade = [90, 100, 80, 76, 88, 65, 65, 63]

print("before \(grade)")

let grade_sort = grade.sorted { (num1, num2) in
   num1 > num2
}

print("after \(grade_sort)")

/**
输出结果:
before [90, 100, 80, 76, 88, 65, 65, 63]
after [100, 90, 88, 80, 76, 65, 65, 63]
*/

let grade = [90, 100, 80, 76, 88, 65, 65, 63]

print("before \(grade)")

let grade_sort = grade.sorted { $0 > $1 }

print("after \(grade_sort)")


/**
输出结果:
before [90, 100, 80, 76, 88, 65, 65, 63]
after [100, 90, 88, 80, 76, 65, 65, 63]
*/

2.3、逃逸闭包

// 定义一个变量,用来存储一个闭包,给后面使用
var completeHandle:() -> Void = {}

// 定义一个函数,这个函数接受一个闭包,并且设置给外部变量,这里必须标记为 @escaping
func doSomeThing(completion: @escaping () -> Void) {
    completeHandle = completion
}

print("设置之前")

// 调用函数,并设置一个闭包
doSomeThing {
    print("完成了")
}

print("设置之后")

// 调用刚才设置好的闭包
completeHandle()

print("调用之后")


/**
输出结果:
设置之前
设置之后
完成了
调用之后
*/

2.4、闭包中的self处理

{[weak self](params) -> returnType in 
    // self变成了可选值,需要用?来使用
    self?.somePropety = ...
    
    statemems
}

相关文章

1、Swift3入门教程之一基础部分

参考资料:

  1. Swift Standard Library Playground
  2. Swift.org
  3. The Swift Programming Language (Swift 3)
  4. Using Swift with Cocoa and Objective-C (Swift 3)
  5. WWDC2016:Session 404 Getting Started with Swift
上一篇 下一篇

猜你喜欢

热点阅读