闭包与数组的过滤,映射,缩减

2016-08-09  本文已影响0人  写啥呢

函数的详细解析(闭包的讲解)

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()


上一篇 下一篇

猜你喜欢

热点阅读