Aprendizaje rápido del sistema 27 el uso de cierres

//: Playground - noun: a place where people can play

import UIKit

/*
 * 本节主要内容:
 * 1.闭包的使用
 */

// 不使用
var array: [Int] = []
for _ in 0..<10 {
    array.append(Int(arc4random()%100))
}

array
func biggerNumber(first: Int, second: Int) -> Bool {
    return first > second
}
array.sort(by: biggerNumber)

// 使用闭包
/*
 * 优势: 直接, 不需要单独声明函数
 * 缺点: 重用性不太好
 */
array.sorted { (first: Int, second: Int) -> Bool in
    return first > second
}
// 简化形式
array.sorted { (first, second) -> Bool in
    return first > second
}
// 简化形式
array.sorted{ first, second -> Bool in
    return first > second }

array.sorted{ first, second in
    return first > second }

// 推荐方式: $0, $1, $2 ......
array.sorted{ return $0 > $1 }
array

// 不推荐: >是方法
array.sorted(by: >)



//: Playground - noun: a place where people can play

import UIKit

// 课堂练习一:
struct Person {
    let name: String
    let age: Int
}

class PersonView {
    var name: String?
    var age: String?
    
    enum InputError: Error {
        case InputMissing // 输入为空
        case AgeIncorrect // 年龄输入不是整型
    }
    
    // 自定义方法
    func createPerson() throws -> Person {
        guard let age = age, let name = name, name.characters.count > 0 && age.characters.count > 0 else {
            throw InputError.InputMissing
        }
        
        guard let ageFormatted = Int(age) else {
            throw InputError.AgeIncorrect
        }
        
        return Person(name: name, age: ageFormatted)
    }
}
// 实例化
var personView = PersonView()
// 模拟用户从界面上输入
personView.age = "21"
personView.name = "Shirley"
do {
    let person = try personView.createPerson()
    print("Success! Person created. \(person)")
} catch PersonView.InputError.InputMissing {
    print("Input Missing")
} catch PersonView.InputError.AgeIncorrect {
    print("Something went wrong, please try again!")
}

// 课堂练习二:
class Album {
    var name: String // 专辑名字
    
    init(name: String) {
        self.name = name
    }
    func getPerformance() -> String {
        return "The album \(name) sold lots."
    }
}

class StudioAlbum: Album {
    var studio: String
    
    init(name: String, studio: String) {
        self.studio = studio
        super.init(name: name)
    }
    
    override func getPerformance() -> String {
        return "The studio album \(name) sold lots."
    }
}

class LiveAlbum: Album {
    var location: String // 现场位置
    
    init(name: String, location: String) {
        self.location = location
        super.init(name: name)
    }
    
    override func getPerformance() -> String {
        return "The live album \(name) sold lots."
    }
}

// 实例化
var taylorSwift = StudioAlbum(name: "Taylor Swift", studio: "The Castles Studios")
var fearless = StudioAlbum(name: "Avril Lavigne", studio: "The Canadian Studio")
var iTunesLive = LiveAlbum(name: "Linkin Park Live", location: "New York")

// 数组
var allAlbums: [Album] = [taylorSwift, fearless, iTunesLive]

for album in allAlbums {
    print(album.getPerformance())
}





Day06

回顾:
1. init
   1.1 目的: 创建对象(结构体/类) + 属性进行初始化
   1.2 要求: init + 没有返回值 + 参数个数没有要求
   1.3 init?本质: 创建对象返回该类型的可选型
        —> 解包
   
2. subscript下标语法:
   2.1 目的: 获取类型(枚举/结构体/类)的属性
   2.2 方式: 像从集合类(数组/字典/集合)中获取元素的值
   2.3 语法: 函数和计算型属性结合
        subscript(index: Int) -> Int {
             get { }
             set { }
        }
       // 结果:
       matric[0] -> 结构体第一个属性
       matric[1] -> 结构体第二个属性 ……..

3. computed property计算型属性和stored property存储属性
    3.1 计算型属性: 指定set/get
    3.2 存储属性: 存储某种类型的值
    3.3 var center: Point2D {
               get { return xxxx }
               set { newValue关键词 }
          }
    3.3 只读属性
          var center: Point2D {
               return xxxx
          }

4. error handling(*****)
   4.1 第一阶段:
       enum VendingMachineError: Error {
           case OutOfStock
           case NotEnoughMoney
           // ………
       }
  4.2 第二阶段:
       func functionName(param: paramType) throws -> returnType {
           // 针对不同的错误, 抛出不同的error
           throw  VendingMachineError.OutOfStock
       }
  4.3 第三阶段:
       a. var result = try! functionName(varName)
       b. var result = try? functionName(varName)
       c. 完整形式: 处理错误
          do {
                var result = try functionName(varName)
          } catch  VendingMachineError.OutOfStock {
               print(“Out of stock”)
          } catch {
                print(“There is the error.”)
          }

今天内容:
	·	 类基本声明和实例化
	·	 类属性分类: 存储属性/计算型属性/类属性/延迟加载属性
	·	 类继承
	·	 类访问限制

类基本声明和实例化
1. 在Swift语言中, 类可以没有继承
2. 样例: 类的声明和实例化
    [ 01_basic_class ]
    —> 存储属性(可选型) + init + init? + 自定义方法

/05_Swift/Day06/Day06-AM1.zip

3. 类的各种属性: 存储属性 / 计算型属性 / 类型属性 / 延迟加载属性
    [ 02_class_property ]
    3.1 存储属性: 使用”属性观察器”机制, 对存储属性值的变化做出观察和相应的反应(willSet: 将要赋值 / didSet: 赋值完 ).
     —>  UInt8.max = 255
    3.2 计算型属性: get set
  —> 问题? 存储属性和计算型属性获取方式?
        a. 先实例化对象, 再通过点语法
        b. 存储属性和计算型属性作用在实例对象上
    3.3 类型属性(Type Property): 作用在该类型上的属性
   —> 例如: 获取方式
         a. 结构体: 结构体名字.类型属性名字
         b. 类: 类名字.类型属性名字
    —> 适用场景:
         a. 登陆用户 —> 实例对象; 分数: 
         b. 记录所有玩家最高分 -> 类型属性
    3.4 延迟加载属性 -> 懒加载属性
    —> 适用场景: 
         a. 依赖于其他属性的值先初始化
         b. 属性的计算特别耗时, 不希望在实例化阶段计算

/05_Swift/Day06/Day06-AM2.zip

———————— 下午内容 ————
1. 样例: 延迟存储属性(Lazy Stored Property): 
     [ 03_lazy_property ]
   —> 在初始化阶段(init), 不被赋值; 
   —> 直到使用/创建的时候才被赋值, 且赋值一次
   —> 延迟存储属性没有”属性观察器”语法

2. Swift语言中类的继承/封装/多态
   2.1 封装 / 继承(单继承; 没有父类) / 多态
   2.2 样例: 声明多个类, 继承关系
        [ 04_class_inheritance ]
     —> 总结:
        a. override
        b. final

/05_Swift/Day06/Day06-AM2.zip

3. 闭包Closure: 
   3.1 三种表现形式:
       全局函数; 嵌套函数(可以捕获上下文所有常量和变量); 闭包表达式(匿名函数语法)
   3.2 闭包表达式语法:
        { (参数列表) -> 返回类型 in
            表达式
        }
       —> 对比函数声明
       func functionName(参数列表) -> 返回类型 {
             表达式
       }
   3.3 样例: 闭包的使用
       [ 05_closure ]

 课堂练习一: 
  [ 06_practice ]
 1).声明类(视图), 添加两个属性(登录名字和年龄; 可选型),自定义方法(创建Person结构体对象)
 2).声明结构体Person(模型)(登录名字和年龄)
 3).要求: 使用Error Handling错误处理机制, 处理下面几种情况
   a. 名字和年龄输入为空
   b. 输入的年龄不符合格式(只能是整型类型)
 4).验证Error Handling错误机制的实现

包括课堂练习一:
/05_Swift/Day06/Day06-PM2.zip

 课堂练习二:
 [ 06_practice ]
 1). 创建三个类,父类是描述专辑类Album, 两个子类, 分别描述录音室专辑类StudioAlbum和现场版专辑LiveAlbum
 2).父类: 专辑名字(属性), init, 自定义方法(返回字符串: 反应销售情况)
 3).StudioAlbum: 录音室名字(属性), init, 重写父类的自定义方法
 4).LiveAlbum: 现场名字(属性); init, 重写父类的自定义方法
 5).声明数组, 元素类型Album, 元素的值是实例化对象, 循环打印每个对象的属性的值

WWDC样例代码链接:
https://developer.apple.com/sample-code/wwdc/


Day06知识点总结:
1. 掌握存储属性观察器, 延迟加载属性的使用和适用场景
2. 掌握类的重写override和final机制
3. 掌握闭包表达式语法














Supongo que te gusta

Origin blog.csdn.net/clarence20170301/article/details/59108942
Recomendado
Clasificación