1.函数嵌套
函数可以嵌套。被嵌套的函数可以访问外侧函数的变量,你可以使用嵌套函数来重构一个太长或者太复杂的函数。
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
2.函数是第一等类型,这意味着函数可以作为另一个函数的返回值。
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
*注意:((Int) -> Int) 这个作为一个返回值,是函数
3.函数也可以当做参数传入另一个函数。
func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, condition: lessThanTen)
函数实际上是一种特殊的闭包
:它是一段能之后被调取的代码。闭包
中的代码能访问闭包
所建作用域
中能得到的变量
和函数
,即使闭包
是在一个不同的作用域
被执行的 - 你已经在嵌套函数例子中所看到。你可以使用{}
来创建一个匿名闭包
。使用in
将参数和返回值类型声明与闭包函数体
进行分离。
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
4.对象和类
使用class
和类名
来创建一个类。类中属性的声明和常量、变量声明一样,唯一的区别就是它们的上下文是类。同样,方法和函数声明也一样。
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
5.枚举和结构体
1)使用enum
来创建一个枚举。就像类和其他所有命名类型一样,枚举
可以包含方法
。
enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.rawValue)
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.rawValue
rawValue
就是case Ace = 1
的 1
2)使用struct
来创建一个结构体
。结构体
和类
有很多相同的地方,比如方法
和构造器
。它们之间最大的一个区别就是结构体
是传值
,类
是传引用
。
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
6.协议和扩展
使用protocol
来声明一个协议。
7.错误处理
8.泛型