Swift3.0 - 真的很简单
Swift3.0 - 数据类型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可选值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 对象和类
Swift3.0 - 属性
Swift3.0 - 函数和闭包
Swift3.0 - 初始化和释放
Swift3.0 - 协议protocol
Swift3.0 - 类和结构体的区别
Swift3.0 - 枚举
Swift3.0 - 扩展
Swift3.0 - 下标
Swift3.0 - 泛型
Swift3.0 - 异常错误
Swift3.0 - 断言
Swift3.0 - 自动引用计数(strong,weak,unowned)
Swift3.0 - 检测API
Swift3.0 - 对象的标识
Swift3.0 - 注释
Swift3.0 - 元类型
Swift3.0 - 空间命名
Swift3.0 - 对象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 类簇
Swift3.0 - 动态调用对象(实例)方法
Swift3.0 - 文本输出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 镜像
Swift3.0 - 遇到的坑
- 定义异常枚举类型
enum OSUserLoginError :Error{
case AllNoComplete
case UserNameEmpty
case PasswordEmpty
}
提示:
注意异常枚举类型必须遵守Error 协议
![1594482-9661bf6f58b2f85f.png](https://i-blog.csdnimg.cn/blog_migrate/660990bd3b56f8587575bb19d779b9fa.webp?x-image-process=image/format,png)
- 可以输出错误值的枚举定义
需求:
录入学生成绩,如果输入的成绩不在0...100 抛出异常
// 定义错误协议
enum ScoreInputError:Error{
case lowZero(name:String,score:Float)
case highHundred(name:String,score:Float)
}
// 定义含有异常机制的函数
func inputStudentName(name:String,score:Float)throws ->Bool{
if score < 0{
throw ScoreInputError.lowZero(name: name, score: score)
}else if score > 100{
throw ScoreInputError.highHundred(name: name, score: score)
}
// 开始录入
// 录入结束
return true
}
// 调用函数
do {
let result = try inputStudentName(name: "张丹", score:300)
}catch ScoreInputError.lowZero(let name,let score){
print("异常:\(name)的成绩为\(score) --小于0")
}catch ScoreInputError.highHundred(let name,var score){
print("异常:\(name)的成绩为\(score) -- 大于1000")
}
运行结果:
异常:张丹的成绩为300.0 -- 大于1000
- 处理不同类型的异常
需求:
用户输入的密码或者用户名为空抛出异常,如果是密码为空,输入密码为空的用户
// 定义异常
enum OSUserLoginError :Error{
case AllNoComplete
case UserNameEmpty
case PasswordEmpty(userName:String)
}
// 定义含有异常机制的函数
func verifyUserName(userName:String,password:String)throws -> Bool{
if userName == "" && password == "" {
throw OSUserLoginError.AllNoComplete
}else if (userName == "" && password != ""){
throw OSUserLoginError.UserNameEmpty
}else if (userName != "" && password == ""){
throw OSUserLoginError.PasswordEmpty(userName: userName)
}
return true
}
// 使用含有异常的函数
do
{
try verifyUserName(userName: "酷走天涯", password: "")
}catch OSUserLoginError.PasswordEmpty(let userName){
print("用户:" + userName + "输入的密码为空")
} catch OSUserLoginError.UserNameEmpty{
print("用户名为空")
} catch{
print(error)
}
运行结果:
用户:酷走天涯输入的密码为空
- where 在错误类型的使用
enum ErrorType:Error {
case success
case error(code:Int)
}
func inputScore(score:Int) throws->Bool{
if score < 0{
throw ErrorType.error(code: 0)
}else if score > 100 {
throw ErrorType.error(code: 1)
}
return true
}
do {
let score = try inputScore(score: -2)
}catch ErrorType.error(let x) where x == 0{ // 可以做判断错误类型
}catch{
print(error)
}
- defer 的延时作用
需求:我们定义一个用户对象,包含姓名和用户图像数据流
// 定义错误协议
enum StudentError:Error{
case NameEmpty
case ScoreLowZero
}
// 定义学生类
class Student{
var name:String = "123"
var score:Float = 0
var userIcon:UnsafeMutableRawPointer = malloc(40*40*4) // 定义用户图像数据流
init(name:String)throws{
if name == ""{
defer{
free(self.userIcon)
print("第2步发生异常清理内存")
}
print("第1步 抛出异常")
throw StudentError.NameEmpty
}
self.name = name
}
}
// 调用函数
do{
let student = try Student(name: "")
}catch {
print(error)
}
运行结果:
第1步 抛出异常
第2步发生异常清理内存
NameEmpty
注意
1.类中使用defer,在对象方法中,使用defer,在defer块中,调用属性之前,必须初始化所有存储属性,重要事说三遍,所有的存储属性,所有的,存储属性
2.defer 在定义的当前作用域最后一步执行
- try 、try!、try? 的用法
A.try
let student = try Student(name: "")
print("运行结果\(student)")
运行结果:
第1步
第2步发生异常清理内存
结论:
我们发现print("运行结果(student)") 这句代码没有执行,说明发生了异常,后面的代码不会执行,但没有报错提示
B.try!
let student = try! Student(name: "")
print("运行结果\(student)")
运行结果:
第1步
第2步发生异常清理内存
fatal error: 'try!' expression unexpectedly raised an error: StudentError.NameEmpty: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.46.2/src/swift/stdlib/public/core/ErrorType.swift, line 178
结论:
一旦发生异常,系统会报错,后面的代码不再继续执行
C.try?
let student = try? Student(name: "")
print("运行结果\(student)")
运行结果:
第1步
第2步发生异常清理内存
运行结果nil
let student = try? Student(name: "234")
print("运行结果\(student)")
运行结果:
运行结果Optional(Student)
结论:
try? 如果发生异常则返回nil,如果没有发生异常,则返回可选值,我们在使用时,需要解包可选值!
应用1:
public enum OSNetError:Error{
/// 错误类型枚举值
case requestError(RequestError)
case responseError(ResponseError)
/// 请求错误异常
public enum RequestError{
case invalidUrl(url:URL)
case parameterException
}
/// 响应错误异常
public enum ResponseError:Int{
case dataFileNil
case missingContentType
case unacceptableStatusCode
case dataFileReadFailed
}
}
请求:
func requestUrl(url:URL)throws{
if !url.absoluteString.contains("http"){
throw OSNetError.requestError(.invalidUrl(url:url))
}
}
应用2: 如果你要使用的值有可能为nil,你最好的写法应该像下面这样
guard let filter = CIFilter(name: "CIGaussianBlur",
withInputParameters: parameters) else { fatalError() }