【学习】重学Swift5-错误处理、三方库等
九、其他话题
错误处理
enum VendingMachineError: Error {
case invalidSelection
case insufficientFunds(coinsNeed: Int)
case outOfStock
} struct Item {
var price: Int
var count: Int
} class VendingMachine {
var inventory = [
"Candy Bar": Item.init(price:12, count: 7),
"Chips": Item.init(price: 20, count: 0),
"Bread": Item.init(price:15, count:5)
] var coinsDecposited = 0 func vend(itemName: String) throws { defer {
print("推出清理")
}
print("开始售卖") guard let item = inventory[itemName] else {
throw VendingMachineError.invalidSelection
} guard item.count > 0 else {
throw VendingMachineError.outOfStock
} guard coinsDecposited >= item.price else {
throw VendingMachineError.insufficientFunds(coinsNeed: item.price)
} coinsDecposited -= item.price
var newItem = item
newItem.count -= 1
inventory[itemName] = newItem
print("售卖成功") }
} var machine = VendingMachine()
machine.coinsDecposited = 5 do {
try machine.vend(itemName: "Chips")
} catch VendingMachineError.invalidSelection {
print("没有当前商品")
} catch VendingMachineError.insufficientFunds(let coinsNeeded) {
print("你需要投\(coinsNeeded)币")
} catch VendingMachineError.outOfStock {
print("已售空")
} catch {
print("未知错误")
} // throw 抛出异常 do-catch处理异常 defer
权限控制
// open public internal fileprivate private
/*
1.类成员的访问级别不能高于类的访问级别;
2.常量、变量、属性、下标脚本访问级别低于其所声明的类型级别,并且如果不是默认访问级别(internal)要明确声明访问级别。
3.在不违反1、2的情况下,setter的访问级别可以抵御getter的访问级别。
4.必要构造方法(required修饰)的访问级别必须和类访问级别相同,狗狗剃的默认逐一构造函数的访问级别不高于其成员的访问级别,其他方法的访问级别遵循规则1
*/
不透明类型
自动引用计数
// 循环引用
// 弱引用weak(对生命周期中引用会变为nil的实例,只能声明变量类型) 无主引用unowned(对初始化赋值之后引用再也不会赋值为nil的实例,无主引用默认始终有值,只能定义为非可选类型) // 闭包的循环引用
lazy var someColisure = {
[unowned self, weak delegate = self.delegate](index: Int, stringToProgress: String) -> String in
// code
}
内存安全
十、常见三方库
Alamofire SwiftJSON R.Swift MonkeyKing Kingfisher SnnapKit Dollar
十一、加餐
1.可选链、
2.KVC
· 继承自NSObject的类,标记@objc的属性可以使用setValue:(_ forKey:)
· 非继承自NSObject的类和结构体,使用索引+参数值
struct ValueType {
var name: String
}
var object = ValueType.init(name: "Objective-c")
// set
object[keyPath: \ValueType.name] = "swift"
// get
let valueOfName = object[keyPath: \ValueType.name]
print(valueOfName)
3.KVO
// 只有NSObject才能支持KVO,且要观察的属性必须使用@objc dynamic修饰
// 方法一
class Person: NSObject {
@objc dynamic var age = 0
}
class ViewController: UIViewController {
let p = Person()
override func viewDidLoad() {
super.viewDidLoad()
p.addObserver(self, forKeyPath: "age", options: [.new, .old], context: nil)
p.age = 33
// Do any additional setup after loading the view.
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "age" {
print(change as Any)
}
}
}
// 方法二
class Person: NSObject {
@objc dynamic var age = 0
}
class ViewController: UIViewController {
@objc dynamic let p = Person()
var ob: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
self.ob = observe(\.p.age, options: [.new, .old], changeHandler: { (_ , change) in
print(change as Any)
})
p.age = 33
// Do any additional setup after loading the view.
}
}
【学习】重学Swift5-错误处理、三方库等的更多相关文章
- Python学习--23 内建模块及第三方库
本文将介绍python里常用的模块.如未特殊说明,所有示例均以python3.4为例: $ python -V Python 3.4.3 网络请求 urllib urllib提供了一系列用于操作URL ...
- 从0开始学爬虫9之requests库的学习之环境搭建
从0开始学爬虫9之requests库的学习之环境搭建 Requests库的环境搭建 环境:python2.7.9版本 参考文档:http://2.python-requests.org/zh_CN/l ...
- iOS:iOS开发非常全的三方库、插件等等
iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...
- 重学C++ (1)
写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...
- three.js是JavaScript编写的WebGL第 三方库
three.js是JavaScript编写的WebGL第 三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质 ...
- 推翻自己和过往,重学自定义View
http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 重学 Java 设计模式:实战单例模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...
- 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
随机推荐
- Blazor学习之旅 (13) Razor类库的使用
在上一篇我们学习了Blazor和JavaScript的互操作性,这一篇我们了解下如何创建和使用Razor类库. 什么是Razor类库? 我们都知道,在.NET应用程序中,我们可以通过NuGet来安装各 ...
- iis6导出Excel报错检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,8000401a错误解决办法
1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双 ...
- 手把手教你在 Sevalla 上部署 Next.js 博客:从搭建到上线全流程
很多开发者会纠结:"现在博客平台这么多,为啥还要自己搭博客?" 答案很简单:用 Next.js 搭的博客,是真正属于你的 "数字资产". 为什么选 Next.j ...
- 使用war包安装jenkins
war包下的jenkins是没有自己的配置文件 安装java jenkins必须依赖的 curl -O https://dshvv-1300009960.cos.ap-beijing.myqcloud ...
- mac快速安装git
前提 每次安装git,都需要安装xcode,我不需要xcode 而且这厮还极其的大,下载慢. 找到一个办法[如果你不需要 Xcode,只安装 Xcode Command Line Tools 就可以了 ...
- qt 显示中文
参考链接 CSDN Tips 直接使用第三种方法 也可以使用 QString::fromLocal8Bit("打开文档文件") 这种方式
- 统计的系统客观性与动态进化性•Freq频率与Bayes两大学派及争论•统计推断•Bayes学派及其基本观点与Bayes估计
统计的系统客观性: 统计数据及其活动不是片面的,而是系统客观反映客观现象. 周期的做"总体统计" + 随机/按需/周期做"抽样统计": 统计的动态进化性: 统计 ...
- webdriver.Chrome New API
The webdriver.Chrome APIs are simplified in the latest version of Selenium, and both find_element_by ...
- win11专业版多桌面如何快速切换的问题
有雨林木风系统的小伙伴使用win11专业版系统时,发现可以创建多个桌面来一起来工作办公,而且每个桌面都是独立的,使用起来很是方便,但是也有很多小伙伴不知道如何快速切换多个桌面,那么win11系统多个桌 ...
- Win11专业版系统无限重启的问题
很多电脑基地的用户在使用电脑的经常会遇到一些问题,这不有用户升级了Windows11系统之后发现,电脑会出现不停重启的问题.这要怎么解决呢?下面,技术员小编就带着大家一起来看看详细的解决方法吧! Wi ...