我使用了 Swift 5.0,不保证向后兼容性。需要 IOS 13+
SwiftYFinance 可通过 Swift Package Manager 获取。
将依赖项添加到您的 Package 文件中
dependencies: [
.package(url: "https://github.com/AlexRoar/SwiftYFinance", .upToNextMajor(from: "1.4.0")),
]
或者将依赖项添加到您的 XCode 项目中:File
> Swift Packages
> Add Package Dependency
https://github.com/AlexRoar/SwiftYFinance
/*
* Main class of SwiftYFinance. Asynchronous method's callback always will
* have format: (Some Data?, Error?). If error is non-nil, then data is going to be nil.
* Review Error description to find out what's wrong.
* Synchronous API is also provided. The only difference is that it blocks the thread and
* returns data rather than passing it to the callback.
*/
import SwiftYFinance
// Searches quote in Yahoo finances and returns found results
SwiftYFinance.fetchSearchDataBy(searchTerm:"AAPL", quotesCount=20) {
data, error in
/*
callback: ([YFQuoteSearchResult]?, Error?) -> Void
struct YFQuoteSearchResult{
var symbol: String?
var shortname: String?
var longname: String?
var exchange: String?
var assetType: String?
}
*/
if error == nil{
return
}
print(data!.longname ?? "No long name")
}
同样的功能,但同步执行
let (data, error) = SwiftYFinance.syncFetchSearchDataBy(searchTerm:"AAPL", quotesCount=20)
if error == nil{
return
}
print(data!.longname ?? "No long name")
尽管在主线程中同步执行命令不是最佳实践,但我仍然将此功能添加到项目中。编写快速、不卡顿的应用程序是您的责任,因此请明智地使用同步方法。
搜索新闻也可以通过 fetchSearchDataBy(searchNews:String, ...)
获取
获取关于标识符的最新数据,收集基本信息。
SwiftYFinance.recentDataBy(identifier:"AAPL"){
data, error in
/*
data ~>
struct RecentStockData{
var currency: String?
var symbol: String?
var exchangeName: String?
var instrumentType: String?
var firstTradeDate: Int?
var regularMarketTime: Int?
var gmtoffset: Int?
var timezone: String?
var exchangeTimezoneName: String?
var regularMarketPrice: Float?
var chartPreviousClose: Float?
var previousClose: Float?
var scale: Int?
var priceHint: Int?
}
*/
if error == nil{
return
}
print(data!.regularMarketPrice ?? "No regularMarketPrice")
}
获取图表数据点
SwiftYFinance.chartDataBy(
identifier:"AAPL",
start: Date(...),
end: Date(...),
interval = .oneday){
data, error in
/*
data ~>[
struct StockChartData{
var date: Date?
var volume: Int?
var open: Float?
var close: Float?
var adjclose: Float?
var low: Float?
var high: Float?
}
]
*/
if error == nil{
return
}
print(data![0]?.open ?? "Open price is unavailable")
}
有时,您需要获取过去某个时间点的数据。使用 chartDataBy(..., moment: Date, ...)
来实现。
SwiftYFinance.chartDataBy(
identifier:"AAPL",
moment: Date(...),
futureMargin: TimeInterval(...)
){
data, error in
/*
data ~>[
struct StockChartData{
var date: Date?
var volume: Int?
var open: Float?
var close: Float?
var adjclose: Float?
var low: Float?
var high: Float?
}
]
*/
if error == nil{
return
}
print(data![0]?.open ?? "Open price is unavailable")
}
API 的这部分非常庞大。Yahoo Finance 拥有大量的摘要模块,我实现了其中的几个。不过,您仍然可以从原始 JSON 参数中获取数据。
我将在每个版本中添加新的模块。目前,只实现了必要的模块。
模块 | 支持 | 模块 | 支持 |
---|---|---|---|
calendarEvents | ✅ | recommendationTrend | ✅ |
summaryProfile | ✅ | quoteType | ✅ |
industryTrend | ✅ | price | ✅ |
summaryDetail | ✅ | incomeStatementHistoryQuarterly | ❌ |
assetProfile | ❌ | balanceSheetHistoryQuarterly | ❌ |
incomeStatementHistory | ❌ | cashFlowStatementHistory | ❌ |
balanceSheetHistory | ❌ | cashFlowStatementHistoryQuarterly | ❌ |
financialData | ❌ | secFilings | ❌ |
upgradeDowngradeHistory | ❌ | institutionOwnership | ❌ |
fundOwnership | ❌ | majorDirectHolders | ❌ |
majorHoldersBreakdown | ❌ | insiderTransactions | ❌ |
insiderHolders | ❌ | netSharePurchaseActivity | ❌ |
sectorTrend | ❌ | earnings | ❌ |
companyOfficers | ❌ | earningsHistory | ❌ |
earningsTrend | ❌ | indexTrend | ❌ |
symbol | ❌ | fundProfile | ❌ |
topHoldings | ❌ | fundPerformance | ❌ |
defaultKeyStatistics | ❌ |
您可以通过调用 summaryDataBy(...)
获取模块
SwiftYFinance.summaryDataBy(identifier: "AAPL", selection = .all){
data, error in
if error != nil{
return
}
print(data)
/*
data ~>
struct IdentifierSummary {
var recommendationTrend:RecommendationTrend?
var summaryProfile:SummaryProfile?
var quoteType:QuoteType?
var price:Price?
var indexTrend:IndexTrend?
var calendarEvents:CalendarEvents?
var summaryDetail:SummaryDetail?
var dataStorage:JSON?
}
*/
// Raw JSON:
print(data.dataStorage)
}
有几种选择类型可用。.all
将获取每个方法,即使尚未支持,以便您可以从原始 JSON 中获取数据。 您可以选择 .supported
,然后将仅获取受支持的数据。 此外,您可以指定特定的模块(例如:.price
)或模块列表(例如:[.price, .summaryDetail]
)
Aleksandr Dremov, dremov.me@gmail.com
SwiftYFinance 基于 MIT 许可证发布。请查看 LICENSE 文件了解更多信息。