函数的详细解析(闭包的讲解)
func sum(a: Int, _ b: Int) -> Int {
return a + b
}
func mul(a: Int, _ b: Int) -> Int {
return a * b
}
// 在Swift中函数是一种类型
// 这也就意味着函数可以作为变量或常量的类型
// 同理函数也可以作为另一个函数的参数或返回值
func foo(array: [Int], fn: (Int, Int) -> Int) -> Int {
var sum = array[0]
for x in array[1..<array.count] {
sum = fn(sum, x)
}
return sum
}
let a = [1, 2, 3, 4, 5]
// 当调用foo函数时第二个参数可以传什么?
// 1. 所有自定义的(Int, Int) -> Int类型的函数
print(foo(a, fn: sum))
// 2. 传入已有的二元运算符: +-*/%(因为运算符也是函数)
print(foo(a, fn: +))
// 3. 传入匿名函数(闭包)
// 3.1 完整的闭包写法
print(foo(a, fn: { (a, b) -> Int in
return a + b
}))
// 3.2 省略掉类型和不必要的括号
print(foo(a, fn: { a, b in a + b }))
// 3.3 省略参数名
print(foo(a, fn: { $0 + $1 }))
// 3.4 尾随闭包
print(foo(a) { (a, b) -> Int in
return a + b
})
print(foo(a) { $0 + $1 })
var array = ["game", "abacus", "hello", "cat", "good", "internationalization", "chaos", "dislike", "zealot", "young"]
// array.sortInPlace(>)
array.sortInPlace({ $0 > $1 })
// array.sortInPlace() { $0 > $1 }
// array.sortInPlace { $0 > $1 }
// 如果函数的最后一个参数是闭包可以写成尾随闭包的形式
// 也就是将闭包放到函数参数的圆括号外面写在一对花括号中
// 如果函数后面有尾随闭包且函数的圆括号中没有参数
// 那么函数的圆括号也可以省略(仅限于有尾随闭包的场景)
array.sortInPlace {
if $0.characters.count == $1.characters.count {
return $0 < $1
}
return $0.characters.count < $1.characters.count
}
print(array)
数组的过滤,映射,缩减(与闭包的结合使用)
let array = [23, 37, 96, 55, 40, 92, 68, 88]
// 1. 过滤
let newArray1 = array.filter { $0 > 50 }
print(newArray1)
let newArray2 = array.filter { $0 % 2 == 0 }
print(newArray2)
// 2. 映射
let newArray3 = array.map { $0 * $0 }
print(newArray3)
let newArray4 = array.map { sqrt(Double($0)) }
print(newArray4)
// 3. 缩减
let result1 = array.reduce(0, combine: +)
print(result1)
let result2 = array.reduce(1, combine: *)
print(result2)
let result3 = array.reduce(array[0]) {
$1 > $0 ? $1 : $0
}
print(result3)
let strArray = ["I", "love", "you"]
let result4 = strArray.reduce("") { $0 + " " + $1 }
print(result4)
类的介绍 (类的属性,方法)
enum Gender {
case Male, Female
}
class Dog {
var nickname: String
var sex: Gender
init(nickname: String, sex: Gender) {
self.nickname = nickname
self.sex = sex
}
func bark() {
print("\(nickname): 旺旺旺...")
}
func mate(other: Dog) -> Bool {
if sex != other.sex {
print("\(nickname)和\(other.nickname)正在交配...")
return true
}
else {
return false
}
}
}
let dog1 = Dog(nickname: "旺财", sex: .Male)
let dog2 = Dog(nickname: "大黄", sex: .Female)
dog1.bark()
if dog1.mate(dog2) {
print("交配成功!!!")
}
else {
print("交配失败!!!")
}
class Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
func perimeter() -> Double {
return 2 * (width + height)
}
func area() -> Double {
return width * height
}
}
let rect = Rectangle(width: 20, height: 8)
print("面积: \(rect.area())")
print("周长: \(rect.perimeter())")
class Clock {
var hour: Int
var minute: Int
var second: Int
init() {
let date = NSDate()
let cal = NSCalendar.currentCalendar()
hour = cal.component(.Hour, fromDate: date)
minute = cal.component(.Minute, fromDate: date)
second = cal.component(.Second, fromDate: date)
}
func showTime() -> String {
return "\(hour):\(minute):\(second)"
}
func run() {
second += 1
if second == 60 {
second = 0
minute += 1
if minute == 60 {
minute = 0
hour += 1
if hour == 24 {
hour = 0
}
}
}
}
}
let clock = Clock()
while true {
print(clock.showTime())
sleep(1)
clock.run()
}
// 步骤1: 定义类(如果你要用的类苹果已经提供了就直接进入第2步)
// 定义类就可以创建出新的类型
// 学生类
//class Student {
// // 变量定义到类的外面就叫变量 - variable
// // 变量定义到类的里面就叫属性 - property
// // 数据抽象 - 找到和学生相关的属性(找名词)
// var name: String
// var age: Int
//
// // 初始化方法(构造方法/构造器) - constructor
// init(name: String, age: Int) {
// self.name = name
// self.age = age
// }
//
// // 函数写到类的外面就叫函数 - function
// // 函数写到类的里面就叫方法 - method
// // 行为抽象 - 找到和学生相关的方法(找动词)
// func eat() {
// print("\(name)正在吃饭.")
// }
//
// func study(courseName: String) {
// print("\(name)正在学习\(courseName).")
// }
//
// func watchJapaneseAV() {
// if age >= 18 {
// print("\(name)正在观看岛国爱情动作片.")
// }
// else {
// print("亲爱的\(name), 我们推荐你观看《熊出没》")
// }
// }
//}
//
//// 步骤2: 创建对象(调用初始化方法)
//let stu1 = Student(name: "骆昊", age: 35)
//// 步骤3: 给对象发消息(通过给对象发消息来解决问题)
//stu1.eat()
//stu1.study("Swift程序设计")
//stu1.watchJapaneseAV()
//
//let stu2 = Student(name: "王大锤", age: 15)
//stu2.eat()
//stu2.study("中国近代史")
//stu2.watchJapaneseAV()