测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可 | MIT |
发布最后发布 | 2016年3月 |
SPM支持 SPM | ✗ |
由 Dan Thorpe 维护。
依赖 | |
Money | >= 0 |
结果 | >= 0 |
SwiftyJSON | >= 0 |
FX 是适用于 iOS、watchOS、tvOS 和 OS X 的 Swift 框架。它为 Money 框架提供了对货币兑换的支持。
为了表示一笔外汇交易,例如将 USD
转换为 EUR
,请使用一个 FX 服务提供商。内置了对 Yahoo 和 OpenExchangeRates.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
封装 FXTransaction
或 FXError
值。显然,在真实代码中,您需要检查错误 ;)
FXTransaction
是一个泛型类型,它由基本货币和对币、兑换汇率以及 FX 服务提供商收取的任何作为基础货币的佣金组成。目前 FXQuote
只支持基于百分比的佣金。
存在一个方便的函数,它仅返回 CounterMoney
作为其 Result
值类型。
Yahoo<USD,EUR>.fx(100) { euros in
print("You got \(euros)")
}
您得到了 .Success(€ 93.09)
创建自定义 FX 服务提供商很简单。协议 FXLocalProviderType
和 FXRemoteProviderType
定义了最小要求。通过协议的扩展提供了 quote
和 fx
方法。
对于远程 FX 服务提供商,即需要发出网络请求以获取汇率的提供商,我们可以查看 Yahoo
提供商来看它是如何工作的。
首先,我们将 FXRemoteProvider
泛型类进行子类化。泛型都约束为 MoneyType
。命名约定遵循 货币对 的约定。
public class Yahoo<B: MoneyType, C: MoneyType>: FXRemoteProvider<B, C>, FXRemoteProviderType {
// etc
}
FXRemoteProvider
为 BaseMoney
和 CounterMoney
提供了类型别名,这些是查询货币代码所需的。
协议要求我们可以构建一个 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只支持USD
、EUR
和RUB
这三种法定货币。
其使用方式与常规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'