Interstellar-Contentful 2.1.0

Interstellar-Contentful 2.1.0

测试测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2017年1月
SwiftSwift 版本3.0
SPM支持 SPM

JP Wright 维护。



Interstellar

您可能会找到的最简单的 Observable 实现,用于函数式响应式编程。

这个库并不像 Conal Elliot 定义的那样使用术语 FRP (函数式响应式编程),而是将其作为一种既具有函数性又具有响应性的范式。更多关于差异的信息,请参阅 为什么我不能说 FRP 但是我刚刚做了

特点

  • [x] 轻量级,简单,跨平台的 FRP
  • [x] 使用 GCD 的多线程变得轻而易举
  • [x] 您的大部分方法仍然符合所需的语法。
  • [x] Swift 3 兼容性
  • [x] 通过 WarpDrive 让使用 GCD 的多线程变得轻而易举
  • [x] 支持 Linux 和 swift build
  • [x] BYOR™ 技术带来您自己的 Result

要求

  • iOS 7.0+ / Mac OS X 10.10+ / Ubuntu 14.10
  • Xcode 8


使用

更多关于此实现如何工作的完整指南,请参阅关于 Swift 中的函数响应式编程 的系列博客,或在 UIKonf 2015 的演讲 如何使用没有黑魔法的函数响应式编程

创建和更新一个信号

let text = Observable<String>()

text.subscribe { string in
  print("Hello \(string)")
}

text.update("World")

映射和转换可观察对象

let text = Observable<String>()

let greeting = text.map { subject in
  return "Hello \(subject)"
}

greeting.subscribe { text in
  print(text)
}

text.update("World")

将函数用作转换

let text = Observable<String>()
let greet: (String)->String = { subject in
  return "Hello \(subject)"
}
text
  .map(greet)
  .subscribe { text in
    print(text)
  }
text.update("World")

处理函数序列中的错误

let text = Observable<String>()

func greetMaybe(subject: String) throws -> String {
  if subject.characters.count % 2 == 0 {
    return "Hello \(subject)"
  } else {
    throw NSError(domain: "Don't feel like greeting you.", code: 401, userInfo: nil)
  }
}

text
  .map(greetMaybe)
  .then { text in
    print(text)
  }
  .error { error in
    print("There was a greeting error")
  }
text.update("World")

这同样适用于异步函数

let text = Observable<String>()
func greetMaybe(subject: String) -> Observable<Result<String>> {
  if subject.characters.count % 2 == 0 {
    return Observable(.success("Hello \(subject)"))
  } else {
    let error = NSError(domain: "Don't feel like greeting you.", code: 401, userInfo: nil)
    return Observable(.error(error))
  }
}

text
  .flatMap(greetMaybe)
  .then { text in
    print(text)
  }
  .error { _ in
    print("There was a greeting error")
  }
text.update(.success("World"))

Flatmap 也可在 observables 中使用

let baseCost = Observable<Int>()

let total = baseCost
  .flatMap { base in
    // Marks up the price
    return Observable(base * 2)
  }
  .map { amount in
    // Adds sales tax
    return Double(amount) * 1.09
  }

total.subscribe { total in
  print("Your total is: \(total)")
}

baseCost.update(10) // prints "Your total is: 21.8"
baseCost.update(122) // prints "Your total is: 265.96"


通讯

  • 如果您 发现了错误,请提交一个问题。
  • 如果您 有功能请求,请提交一个问题。
  • 如果您 想贡献代码,请提交一个问题或提交一个 pull 请求。

安装

iOS 上的动态框架需要最小的部署目标为 iOS 8 或更高。要使用 Interstellar 并针对 iOS 7 的项目,您必须将所有 Swift 文件直接包含到您的项目中。

swift build

将 Interstellar 添加到您的 Package.swift

import PackageDescription

let package = Package(
  name: "Your Awesome App",
  targets: [],
  dependencies: [
    .Package(url: "https://github.com/jensravens/interstellar.git", majorVersion: 2),
  ]
)

常见问题解答 (FAQ)

为什么选择 Interstellar 而不是 [在此处插入您喜欢的 FRP 框架]?

Interstellar 的设计宗旨是轻量级。没有 UIKit 绑定,没有重型的结构 - 只是一个简单的 Obersable<T>。因此它易于理解和移植(除了 Foundation 之外没有其他依赖)。

此外,Interstellar 支持 BYOR(自行提供 Result<T>)。由于其基于协议的实现方式,您可以直接使用来自其他框架的结果类型与 Interstellar 方法配合使用。


致谢

Interstellar 由 Jens Ravens 所有并维护。

变更日志

  • 1.1 增加了与 Swift 2 的兼容性。同时将 bind 重命名为 flatMap 以保持与 OptionalArray 的一致性。
  • 1.2 Thread 已转移到名为 WarpDrive 的新项目中。
  • 1.3 WarpDrive 已合并到 Interstellar 中。此外,Interstellar 现在通过 cocoapods 分为子规格,以便可以轻松选择所需组件。基本的信号库现在是“Interstellar/Core”。
  • 1.4 支持 swift build 和新的 Swift 软件包管理器,包括对 Linux 的支持。同时删除了过时的 bind 方法。
  • 2 介绍 Observable<T>,这是 Signal 的继任者。使用信号的 observable 属性将代码从 Signal<T> 迁移过来。还增加了对 Warpdrive 的 Linux 支持,并引入了 BYOR™ 技术 Bring Your Own Result<T>

许可证

Interstellar 在 MIT 许可证下发布。有关详情,请参阅 LICENSE。