写在前面
欢迎大家关注我的个人博客:<a href="http://blog.noasis.cn" >博客地址</a>,这里主要是我在个人开发时候遇到的坑和挖完的坑,包括 PHP CentOS 以及 Swift 等相关只是
这篇博文,我将介绍一种通过设置通用型的结果校验枚举,来为函数内建错误处理机制。
知识点:
- 枚举类型
- 泛型
- 可选型
- 结构体
- 错误类型
具体实现
创建数据结构
// 创建订单
struct Order {
let orderNumber: Int
let person: Person?
}
// 创建收件人
struct Person {
let name: String
let address: Address?
}
// 创建订单地址信息
struct Address {
let streetName: String
let city: String
let state: String?
}
创建结果枚举
enum LookupError: ErrorType {
case PersonNotFound
case AddressNotFound
case StateNotFount
}
enum OrderResult {
case Success(String)
case Error(LookupError)
}
创建处理函数 返回值是 OrderResult
func orderInfo(order: Order) -> OrderResult {
guard let myPerson = order.person else {
return .Error(.PersonNotFound)
}
guard let myAddress = myPerson.address else {
return .Error(.AddressNotFound)
}
guard let myState = myAddress.state else {
return .Error(.StateNotFount)
}
return .Success(myState)
}
实例数据结构对象:各种情况
let orderNoPerson = Order(orderNumber: 1, person: nil)
let orderNoAddress = Order(orderNumber: 2, person: Person(name: "zZ爱吃菜", address: nil))
let orderNoState = Order(orderNumber: 3, person: Person(name: "zZ爱吃菜", address: Address(streetName: "Fenjiang", city: "Foshan", state: nil)))
let orderFull = Order(orderNumber: 4, person: Person(name: "zZ爱吃菜", address: Address(streetName: "Fenjiang", city: "Foshan", state: "China")))
创建获取处理结果函数
func getOrderInfoResult(result: OrderResult) -> String {
switch result {
case let .Success(state):
return "获取地址:\(state)"
case let .Error(error):
return "错误原因:\(error)"
}
}
各种实例化对象在处理函数中的返回值
getOrderInfoResult(orderInfo(orderNoPerson))
getOrderInfoResult(orderInfo(orderNoAddress))
getOrderInfoResult(orderInfo(orderNoState))
getOrderInfoResult(orderInfo(orderFull))
效果图
进阶篇:通用型结果处理枚举
通用型结果枚举
上面的枚举,成功是强制返回的是 Success<String>
类型,这样太局限了,假如返回的结果是 Int
?
// 这样可以制作一个通用型的结果校验枚举,即返回正确时的类型可以自定义,String Int 等等
enum Result<T>{
case Success(T)
case Error(ErrorType)
}
研究一下 Swift 中的错误处理
//: ### Swift 中的错误处理
// Swift 内建错误处理机制的局限性在于它必须接住函数的返回类型来触发
// 重写 orderInfo 函数,重构带有错误处理机制的函数
func orderInfo1(order: Order) throws -> String {
guard let myPerson = order.person else {
throw LookupError.PersonNotFound
}
guard let myAddress = myPerson.address else {
throw LookupError.AddressNotFound
}
guard let myState = myAddress.state else {
throw LookupError.StateNotFount
}
return myState
}
// 通过 do ... catch 代码块执行带错误处理机制的函数:
do {
let state = try orderInfo1(orderNoPerson)
print("地址是:\(state)")
} catch {
print("错误原因:\(error)")
}
结果图
总结:
枚举类型在 Swift 中是一种很方便我们处理多分枝的数据类型
enum action {
case act1
cate act2
cate act3
}
func doAction(act: action) {
switch act {
case act1:
// doSomething
case act2:
// doSomething
case act3:
// doSomething
}
}
Swift 中的错误处理
// 记住 定义带有错误处理的函数 需要这样生命
func orderInfo1(order: Order) throws -> String
// 执行带有错误处理的函数 需要这样做 do catch
do {
let state = try orderInfo1(orderNoPerson
print("地址是:\(state)")
} catch {
print("错误原因:\(error)")
}