//: 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. 掌握闭包表达式语法
Swift 系统学习 27 闭包的使用
猜你喜欢
转载自blog.csdn.net/clarence20170301/article/details/59108942
今日推荐
周排行