MoneyFX 1.1.0

MoneyFX 1.1.0

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2016年3月
SPM支持 SPM

Dan Thorpe 维护。



 
依赖
Money>= 0
结果>= 0
SwiftyJSON>= 0
 

MoneyFX 1.1.0

FX

FX 是适用于 iOS、watchOS、tvOS 和 OS X 的 Swift 框架。它为 Money 框架提供了对货币兑换的支持。

外汇兑换 (FX)

为了表示一笔外汇交易,例如将 USD 转换为 EUR,请使用一个 FX 服务提供商。内置了对 YahooOpenExchangeRates.org 服务的支持。但消费者也可以创建自己的。

以下代码片段表示使用 Yahoo 的货币转换器进行货币兑换。

Yahoo<USD,EUR>.quote(100) { result in
    if let tx = result.value {
        print("Exchanged \(tx.base) into \(tx.counter) with a rate of \(tx.rate) and \(tx.commission) commission.")
    }
}

将 100.00 美元兑换为 93.09 欧元,汇率为 0.93089,佣金为 0.00 美元。

异步返回的结果使用 Result 封装 FXTransactionFXError 值。显然,在真实代码中,您需要检查错误 ;)

FXTransaction 是一个泛型类型,它由基本货币和对币、兑换汇率以及 FX 服务提供商收取的任何作为基础货币的佣金组成。目前 FXQuote 只支持基于百分比的佣金。

存在一个方便的函数,它仅返回 CounterMoney 作为其 Result 值类型。

Yahoo<USD,EUR>.fx(100) { euros in
    print("You got \(euros)")
}

您得到了 .Success(€ 93.09)

创建自定义 FX 服务提供商

创建自定义 FX 服务提供商很简单。协议 FXLocalProviderTypeFXRemoteProviderType 定义了最小要求。通过协议的扩展提供了 quotefx 方法。

对于远程 FX 服务提供商,即需要发出网络请求以获取汇率的提供商,我们可以查看 Yahoo 提供商来看它是如何工作的。

首先,我们将 FXRemoteProvider 泛型类进行子类化。泛型都约束为 MoneyType。命名约定遵循 货币对 的约定。

public class Yahoo<B: MoneyType, C: MoneyType>: FXRemoteProvider<B, C>, FXRemoteProviderType {
    // etc
}

FXRemoteProviderBaseMoneyCounterMoney 提供了类型别名,这些是查询货币代码所需的。

协议要求我们可以构建一个 NSURLRequest

public static func request() -> NSURLRequest {
  return NSURLRequest(URL: NSURL(string: "https://download.finance.yahoo.com/d/quotes.csv?s=\(BaseMoney.Currency.code)\(CounterMoney.Currency.code)=X&f=nl1")!)
}

最后一个要求是,网络结果可以被映射到Result中。

FXQuote是一个结构体,用于组合要使用的汇率和百分比佣金。这两个属性都是BankersDecimal值(请参阅下文有关小数实现的详细说明)。

public static func quoteFromNetworkResult(result: Result<(NSData?, NSURLResponse?), NSError>) -> Result<FXQuote, FXError> {
  return result.analysis(
    ifSuccess: { data, response in
      let rate: BankersDecimal = 1.5 // or whatever  
      return Result(value: FXQuote(rate: rate))
    },
    ifFailure: { error in
      return Result(error: .NetworkError(error))
    }
  )
}

请注意,提供商本身不需要进行任何网络操作。所有操作都由框架完成。这种架构设计是故意的,因为它使得对适配器代码进行单元测试变得非常容易。

比特币

FX支持使用CEX.IO贸易API来支持比特币货币交换的报价。CEX只支持USDEURRUB这三种法定货币

其使用方式与常规FX略有不同。要表示购买比特币,可以使用如下方式表示CEXBuy

CEXBuy<USD>.quote(100) { result in
    if let tx = result.value {
        print("\(tx.base) will buy \(tx.counter) at a rate of \(tx.rate) with \(tx.commission)")
    }
}

100.00美元可购买Ƀ0.26219275,汇率为0.0026272,手续费为0.20美元。

要表示出售比特币,可以使用如下方式表示CEXSell

CEXSell<EUR>.quote(50) { result in
    if let tx = result.value {
        print("\(tx.base) will sell for \(tx.counter) at a rate of \(tx.rate) with \(tx.commission) commission.")
    }
}

50.00Ƀ可按351.5405的汇率出售为17,541.87欧元,手续费为0.10Ƀ。

如果尝试使用CEX不支持货币购买或出售,编译器将阻止您的代码编译。

CEXSell<GBP>.quote(50) { result in
    // etc
}

类型'Currency.GBP'不遵循协议'CEXSupportedFiatCurrencyType'