Swift 跟 OC 有着完全不同的设计哲学,它鼓励你使用 protocol 而不是 super class,使用 enum 和 struct 而不是 class,它支持函数式特性、范型和类型推导,让你可以轻松封装异步过程,用链式调用避免 callback hell。如果你还是用 OC 的思维写着 Swift 代码,那可以说是一种极大的资源浪费,你可能还会因为 Swift 弱鸡的反射而对它感到不满,毕竟 Swift 在强类型和安全性方面下足了功夫,如果不使用 OC 的 runtime,在动态性方面是远不如 OC 的。
OOP 和消息传递非常适合 UI 编程,在这方面来说 OC 是非常称职的,整个 Cocoa Touch 框架也都是面向对象的,所以对于 iOS 开发来说,不管你使用什么语言,都必须熟悉 OOP。在 UI 构建方面,无论是 Swift 还是 OC,无非都是调用 API 罢了,在有自动提示的情况下,其实编码体验都差不多。那 Swift 相比于 OC 的优势到底体现在什么地方呢,我认为是 UI 以外的地方,跟 UI 关系越小,Swift 能一展拳脚的余地就越大,譬如网络层。
讲到网络层就绕不开 Alamofire,Alamofire 几乎是现在用 Swift 开发 iOS App 的标配,它是个很棒的库,几乎能满足所有网络方面的日常需求,但如果对它再封装一下的话,不仅使用起来更得心应手,而且能将第三方库与业务代码解耦,以后万一要更换方案会更加方便。
Alamofire 使用 Result 来表示请求返回的结果,它是个 enum,长这样:
1 2 3 4 5 6 7 8 9 10 11 12 |
public enum Result { case Success(Value) case Failure(Error) /// Returns `true` if the result is a success, `false` otherwise. public var isSuccess: Bool { get } /// Returns `true` if the result is a failure, `false` otherwise. public var isFailure: Bool { get } /// Returns the associated value if the result is a success, `nil` otherwise. public var value: Value? { get } /// Returns the associated error value if the result is a failure, `nil` otherwise. public var error: Error? { get } } |
我们可以对它进行扩展,让它支持链式调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import Foundation import Alamofire extension Result { // Note: rethrows 用于参数是一个会抛出异常的闭包的情况,该闭包的异常不会被捕获,会被再次抛出,所以可以直接使用 try,而不用 do-try-catch // U 可能为 Optional func map(@noescape transform: Value throws -> U) rethrows -> Result { switch self { case .Failure(let error): return .Failure(error) case .Success(let value): return .Success(try transform(value)) } } // 若 transform 的返回值为 nil 则作为异常处理 func flatMap(@noescape transform: Value throws -> U?) rethrows -> Result { switch self { case .Failure(let error): return .Failure(error) case .Success(let value): guard let transformedValue = try transform(value) else { return .Failure(SYError.errorWithCode(.TransformFailed) as! Error) } return .Success(transformedValue) } } // 适用于 transform(value) 之后可能产生 error 的情况 func flatMap(@noescape transform: Value throws -> Result) rethrows -> Result { switch self { case .Failure(let error): return .Failure(error) case .Success(let value): return try transform(value) } } // 处理错误,并向下传递 func mapError(@noescape transform: Error throws -> NSError) rethrows -> OOP 和消息传递非常适合 UI 编程,在这方面来说 OC 是非常称职的,整个 Cocoa Touch 框架也都是面向对象的,所以对于 iOS 开发来说,不管你使用什么语言,都必须熟悉 OOP。在 UI 构建方面,无论是 Swift 还是 OC,无非都是调用 API 罢了,在有自动提示的情况下,其实编码体验都差不多。那 Swift 相比于 OC 的优势到底体现在什么地方呢,我认为是 UI 以外的地方,跟 UI 关系越小,Swift 能一展拳脚的余地就越大,譬如网络层。 讲到网络层就绕不开 Alamofire,Alamofire 几乎是现在用 Swift 开发 iOS App 的标配,它是个很棒的库,几乎能满足所有网络方面的日常需求,但如果对它再封装一下的话,不仅使用起来更得心应手,而且能将第三方库与业务代码解耦,以后万一要更换方案会更加方便。 Alamofire 使用 Result 来表示请求返回的结果,它是个 enum,长这样:
我们可以对它进行扩展,让它支持链式调用:
|