首页
学习
活动
专区
圈层
工具
发布

封装一个 Swift-Style 的网络模块

Swift 跟 OC 有着完全不同的设计哲学,它鼓励你使用 protocol 而不是 super class,使用 enum 和 struct 而不是 class,它支持函数式特性、范型和类型推导,让你可以轻松封装异步过程...如果你还是用 OC 的思维写着 Swift 代码,那可以说是一种极大的资源浪费,你可能还会因为 Swift 弱鸡的反射而对它感到不满,毕竟 Swift 在强类型和安全性方面下足了功夫,如果不使用 OC...Alamofire 使用 Result 来表示请求返回的结果,它是个 enum,长这样: public enum ResultError : ErrorType> { case...-> Void) { switch self { case .Failure(let error): handler(error)....flatMap { $0.valueForKey(responseKey) } } checkJSONDict用来处理服务器返回的错误信息,具体的处理逻辑不同项目都不一样,主要看跟服务器的约定

2.2K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    用Swift写一个响应式编程库

    之前, 需要定义订阅后返回的数据结构,这里我只关心成功和失败两种状态的数据,所以可以这样写: enum Result { case success(Value) case error(Error) }...map map 比较简单,就是将一个 返回值为包装值的函数 作用于一个包装(Wrapped)值的过程, 这里的包装值可以理解为可以包含其他值的一种结构,例如 Swift 中的数组,可选类型都是包装值。...flatMap 和 map 很相似,但也有一些不同,以可选型为例,Swif t是这样定义 map 和 flatMap 的: public func map(_ transform: (Wrapped)...flatMap 和 map 的不同主要体现在 transform 函数的返回值不同。map 接受的函数返回值类型是 U类型,而 flatMap 接受的函数返回值类型是 U?类型。...= "¥99.9" let price = aString.flatMap{ Float($0)} // Price is nil 我们这里 flatMap 和 Swift 中数组以及可选型中的 flatMap

    1.2K50

    用Swift写一个响应式编程库

    之前, 需要定义订阅后返回的数据结构,这里我只关心成功和失败两种状态的数据,所以可以这样写: enum Result { case success(Value) case error(Error) }...map map 比较简单,就是将一个 返回值为包装值的函数 作用于一个包装(Wrapped)值的过程, 这里的包装值可以理解为可以包含其他值的一种结构,例如 Swift 中的数组,可选类型都是包装值。...flatMap 和 map 很相似,但也有一些不同,以可选型为例,Swif t是这样定义 map 和 flatMap 的: public func map(_ transform: (Wrapped)...flatMap 和 map 的不同主要体现在 transform 函数的返回值不同。map 接受的函数返回值类型是 U类型,而 flatMap 接受的函数返回值类型是 U?类型。...= "¥99.9" let price = aString.flatMap{ Float($0)} // Price is nil 我们这里 flatMap 和 Swift 中数组以及可选型中的 flatMap

    1K70

    46 道 Swift 常见面试题解

    4、实现一个 min 函数,返回两个元素较小的元素 5、map、filter、reduce 的作用 6、map 与 flatmap 的区别 7、什么是 copy on write 8、如何获取当前代码的函数名和行号...是什么意思 17、associatedtype 的作用 18、什么时候使用 final 19、public 和 open 的区别 20、声明一个只有一个参数没有返回值闭包的别名 21、定义静态方法时关键字...rethrows -> [ElementOfResult] 这个方法, 中间的函数返回值为一个可选值, 而 flatmap 会丢掉那些返回值为 nil 的值 例如 ["1", "@", "2", "3"..., 在模块外无法继承, 而 open 则可以任意继承, 公开度来说, public < open ▐ 2.20 声明一个只有一个参数没有返回值闭包的别名 没有返回值也就是返回值为 Void typealias..., 如果要监控一个属性, 则必须要标记为 dynamic ▐ 2.24 什么时候使用 @objc @objc 用途是为了在 Objective-C 和 Swift 混编的时候, 能够正常调用 Swift

    6K33

    RxJava2

    而函数式编程是面向数学的抽象,将计算描述为一种表达式求值,函数可以在任何地方定义,并且可以对函数进行组合。响应式编程是一种面向数据流和变化传播的编程范式,数据更新是相关联的。...,参数就是要请求的数量,一般如果不限制请求数量,可以 // 写成Long.MAX_VALUE。...A 和发射器 B 各取出一个事件来组合,并且一个事件只能被使用一次,组合的顺序是严格按照事件发送的顺序来进行的,所以上面截图中,可以看到,1 永远是和 A 结合的,2 永远是和 B 结合的。...FlatMap 是一个很有趣的东西,我坚信你在实际开发中会经常用到。...concatMap 上面其实就说了,concatMap 与 FlatMap 的唯一区别就是 concatMap 保证了顺序,所以,我们就直接把 flatMap 替换为 concatMap 验证吧。

    83210

    Swift3.0 Alamofire初级应用

    序:做过iOS开发的人肯定都知道AFN,现在Swift逐渐流行AFN团队又用Swift写了Alamofire。从头开始学习一下,看看新的Alamofire有什么性能的优化和不同。...功能特点 1、请求连接,处理接受不同类型的返回 2、 URL / JSON / plist 参数编码 3、上传 File / Data / Stream / MultipartFormData 4、用请求或者恢复数据下载文件...5、身份认证和url凭证 6、HTTP 返回验证 7、上传或者下载进程显示 8、cURL命令输出 9、动态适应和重试请求 10、TLS证书和公钥锁 11、网络是否可用判断 12、完整的单元检测 组件库..., completionHandler: @escaping (DataResponse) -> Void)) -> Self 响应验证 在默认情况下,Alamofire对待任何完整的请求不管什么响应内容都是成功的...) 给一个请求添加一个自定义的请求头,这个请求头必须是全局的,在你请求的时候更容易去获取和改变请求头。

    2.5K20

    Why Swift? Generics(泛型), Collection(集合类型), POP(协议式编程), Memory Management(内存管理)

    return input; } 这两个函数都是可以允许任意类型的 input 参数,不同在于返回的类型在 anyAdd 函数里是可以和入参不一样的,这样就会失控,在后续的操作中容易出错。...makeIterator() -> Self.Iterator //... } 重新查找靠的是这个新的迭代器,而对于切片这样的会重新生成新 Sequence 的操作就需要 SubSequence 进行存储和返回...下面看看 Swift 源码(swift/stdlib/public/core/SequenceAlgorithms.swift.gyb)中 flatmap 的实现: //===------------...WhiteDragon().fire() BlackDragon().fly() YellowDragon().fire() 可以看到一来没有了重复代码,二来结构也清晰了很多而且更容易扩展,Dragon 的种类和能力的组合也更加方便和清晰...Swift 语言是支持编译型语言的直接派发,函数表派发和消息机制派发三种派发方式的,下面分别对这三种派发方式说明下。

    1.4K20

    深入理解Reactor核心概念

    它非常适合处理只需返回单个数据的异步操作,如数据库查询、网络请求等。 Mono mono = Mono.just("Hello, Reactor!")...Reactor 提供了几种方法来捕获和处理流中的异常: onErrorReturn:发生错误时,返回一个默认值。 onErrorResume:发生错误时,切换到另一个流。...以下是一个例子,展示如何通过 flatMap 和 buffer 重新组合流数据。假设我们有一组用户 ID,并且我们想为每个用户 ID 发起异步请求获取用户信息,同时我们想把结果分批处理。...异步请求 (flatMap):使用 flatMap 对每批用户 ID 发起异步请求。...模拟请求延迟:fetchUserById 模拟一个延迟的异步请求,每 500 毫秒返回一个结果。这个模拟了通过网络请求获取用户信息的过程。

    61410
    领券