json - 我希望将雅虎财经 API 过滤为仅出价在 0 美元到 10 美元之间的股票

标签 json swift alamofire yahoo-api yahoo-finance

我目前正在使用 AlamoFire 和 Json 将 yahoo Finance api 获取到我的应用程序中。我想过滤出价类别,仅显示 0 美元到 10 美元之间的股票,我该如何执行此操作。附:我正在使用 swift 。我希望有人能帮帮忙。非常感谢。我将在下面附上一些代码。

import UIKit
import Alamofire

struct StockSearchResult {
    var symbol: String?
    var name: String?
    var exchange: String?
    var assetType: String?
}

struct Stock {

var ask: String?
var averageDailyVolume: String?
var bid: String?
var bookValue: String?
var changeNumeric: String?
var changePercent: String?
var dayHigh: String?
var dayLow: String?
var dividendShare: String?
var dividendYield: String?
var ebitda: String?
var epsEstimateCurrentYear: String?
var epsEstimateNextQtr: String?
var epsEstimateNextYr: String?
var eps: String?
var fiftydayMovingAverage: String?
var lastTradeDate: String?
var last: String?
var lastTradeTime: String?
var marketCap: String?
var companyName: String?
var oneYearTarget: String?
var open: String?
var pegRatio: String?
var peRatio: String?
var previousClose: String?
var priceBook: String?
var priceSales: String?
var shortRatio: String?
var stockExchange: String?
var symbol: String?
var twoHundreddayMovingAverage: String?
var volume: String?
var yearHigh: String?
var yearLow: String?

var dataFields: [[String : String]]

}

struct ChartPoint {
    var date: NSDate?
    var volume: Int?
    var open: CGFloat?
    var close: CGFloat?
    var low: CGFloat?
    var high: CGFloat?

}

enum ChartTimeRange {
    case OneDay, FiveDays, TenDays, OneMonth, ThreeMonths, OneYear, FiveYears
}



class SwiftStockKit {

    class func fetchStocksFromSearchTerm(term term: String, completion:(stockInfoArray: [StockSearchResult]) -> ()) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

            let searchURL = "http://autoc.finance.yahoo.com/autoc"

            Alamofire.request(.GET, searchURL, parameters: ["query": term, "region": 2, "lang": "en"]).responseJSON { response in

                if let resultJSON = response.result.value as? [String : AnyObject]  {

                    if let jsonArray = (resultJSON["ResultSet"] as! [String : AnyObject])["Result"] as? [[String : String]] {

                        var stockInfoArray = [StockSearchResult]()
                        for dictionary in jsonArray {
                            stockInfoArray.append(StockSearchResult(symbol: dictionary["symbol"], name: dictionary["name"], exchange: dictionary["exchDisp"], assetType: dictionary["typeDisp"]))
                        }

                        dispatch_async(dispatch_get_main_queue()) {
                            completion(stockInfoArray: stockInfoArray)
                        }
                    }
                }
            }
        }
    }

    class func fetchStockForSymbol(symbol symbol: String, completion:(stock: Stock) -> ()) {

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

            let stockURL = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22\(symbol)%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&format=json"

            Alamofire.request(.GET, stockURL).responseJSON { response in

                if let resultJSON = response.result.value as? [String : AnyObject]  {

                    if let stockData = ((resultJSON["query"] as! [String : AnyObject])["results"] as! [String : AnyObject])["quote"] as? [String : AnyObject] {

                        // lengthy creation, yeah
                        var dataFields = [[String : String]]()

                        dataFields.append(["Ask" : stockData["Ask"] as? String ?? "N/A"])
                        dataFields.append(["Average Daily Volume" : stockData["AverageDailyVolume"] as? String ?? "N/A"])
                        dataFields.append(["Bid" : stockData["Bid"] as? String ?? "N/A"])
                        dataFields.append(["Book Value" : stockData["BookValue"] as? String ?? "N/A"])
                        dataFields.append(["Change" : stockData["Change"] as? String ?? "N/A"])
                        dataFields.append(["Percent Change" : stockData["ChangeinPercent"] as? String ?? "N/A"])
                        dataFields.append(["Day High" : stockData["DaysHigh"] as? String ?? "N/A"])
                        dataFields.append(["Day Low" : stockData["DaysLow"] as? String ?? "N/A"])
                        dataFields.append(["Div/Share" : stockData["DividendShare"] as? String ?? "N/A"])
                        dataFields.append(["Div Yield" : stockData["DividendYield"] as? String ?? "N/A"])
                        dataFields.append(["EBITDA" : stockData["EBITDA"] as? String ?? "N/A"])
                        dataFields.append(["Current Yr EPS Estimate" : stockData["EPSEstimateCurrentYear"] as? String ?? "N/A"])
                        dataFields.append(["Next Qtr EPS Estimate" : stockData["EPSEstimateNextQuarter"] as? String ?? "N/A"])
                        dataFields.append(["Next Yr EPS Estimate" : stockData["EPSEstimateNextYear"] as? String ?? "N/A"])
                        dataFields.append(["Earnings/Share" : stockData["EarningsShare"] as? String ?? "N/A"])
                        dataFields.append(["50D MA" : stockData["FiftydayMovingAverage"] as? String ?? "N/A"])
                        dataFields.append(["Last Trade Date" : stockData["LastTradeDate"] as? String ?? "N/A"])
                        dataFields.append(["Last" : stockData["LastTradePriceOnly"] as? String ?? "N/A"])
                        dataFields.append(["Last Trade Time" : stockData["LastTradeTime"] as? String ?? "N/A"])
                        dataFields.append(["Market Cap" : stockData["MarketCapitalization"] as? String ?? "N/A"])
                        dataFields.append(["Company" : stockData["Name"] as? String ?? "N/A"])
                        dataFields.append(["One Yr Target" : stockData["OneyrTargetPrice"] as? String ?? "N/A"])
                        dataFields.append(["Open" : stockData["Open"] as? String ?? "N/A"])
                        dataFields.append(["PEG Ratio" : stockData["PEGRatio"] as? String ?? "N/A"])
                        dataFields.append(["PE Ratio" : stockData["PERatio"] as? String ?? "N/A"])
                        dataFields.append(["Previous Close" : stockData["PreviousClose"] as? String ?? "N/A"])
                        dataFields.append(["Price-Book" : stockData["PriceBook"] as? String ?? "N/A"])
                        dataFields.append(["Price-Sales" : stockData["PriceSales"] as? String ?? "N/A"])
                        dataFields.append(["Short Ratio" : stockData["ShortRatio"] as? String ?? "N/A"])
                        dataFields.append(["Stock Exchange" : stockData["StockExchange"] as? String ?? "N/A"])
                        dataFields.append(["Symbol" : stockData["Symbol"] as? String ?? "N/A"])
                        dataFields.append(["200D MA" : stockData["TwoHundreddayMovingAverage"] as? String ?? "N/A"])
                        dataFields.append(["Volume" : stockData["Volume"] as? String ?? "N/A"])
                        dataFields.append(["52w High" : stockData["YearHigh"] as? String ?? "N/A"])
                        dataFields.append(["52w Low" : stockData["YearLow"] as? String ?? "N/A"])

                        let stock = Stock(
                            ask: dataFields[0].values.first,
                            averageDailyVolume: dataFields[1].values.first,
                            bid: dataFields[2].values.first,
                            bookValue: dataFields[3].values.first,
                            changeNumeric: dataFields[4].values.first,
                            changePercent: dataFields[5].values.first,
                            dayHigh: dataFields[6].values.first,
                            dayLow: dataFields[7].values.first,
                            dividendShare: dataFields[8].values.first,
                            dividendYield: dataFields[9].values.first,
                            ebitda: dataFields[10].values.first,
                            epsEstimateCurrentYear: dataFields[11].values.first,
                            epsEstimateNextQtr: dataFields[12].values.first,
                            epsEstimateNextYr: dataFields[13].values.first,
                            eps: dataFields[14].values.first,
                            fiftydayMovingAverage: dataFields[15].values.first,
                            lastTradeDate: dataFields[16].values.first,
                            last: dataFields[17].values.first,
                            lastTradeTime: dataFields[18].values.first,
                            marketCap: dataFields[19].values.first,
                            companyName: dataFields[20].values.first,
                            oneYearTarget: dataFields[21].values.first,
                            open: dataFields[22].values.first,
                            pegRatio: dataFields[23].values.first,
                            peRatio: dataFields[24].values.first,
                            previousClose: dataFields[25].values.first,
                            priceBook: dataFields[26].values.first,
                            priceSales: dataFields[27].values.first,
                            shortRatio: dataFields[28].values.first,
                            stockExchange: dataFields[29].values.first,
                            symbol: dataFields[30].values.first,
                            twoHundreddayMovingAverage: dataFields[31].values.first,
                            volume: dataFields[32].values.first,
                            yearHigh: dataFields[33].values.first,
                            yearLow: dataFields[34].values.first,
                            dataFields: dataFields
                        )
                        dispatch_async(dispatch_get_main_queue()) {
                            completion(stock: stock)
                        }
                    }
                }
            }
        }
    }

最佳答案

如果你提前知道你想要过滤 1 到 10 之间的数组,你可以像这样。

struct Stock {
    var currentPrice : Double
}

let aStock = Stock(currentPrice: 1.1)
let bStock = Stock(currentPrice: 20.4)
let cStock = Stock(currentPrice: 5.0)

let stocks = [aStock,bStock,cStock]

let filteredStocks = stocks.filter({$0.currentPrice >= 1.0 && $0.currentPrice <= 10.0 })

上面的代码只是下面代码的简写

var filteredStocks = [Stock]()

for stock in stocks {
    if (stock.currentPrice >= 1.0 && stock.currentPrice <= 10.0) {
        filteredStocks.append(stock)
    }
}

如果您想让最小和最大范围更加动态,您可以将其放置在以最小和最大作为参数的方法中。

func filter(stocks: [Stock], from min: Double, to max: Double){
    return stocks.filter({$0.currentPrice >= min && $0.currentPrice <= max })
}

关于json - 我希望将雅虎财经 API 过滤为仅出价在 0 美元到 10 美元之间的股票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38471636/

相关文章:

swift - 在闭包中发布时未收到 NSNotificationCenter 通知

json - REST API JSON 错误代码和错误消息

ios - 使用 RestKit 映射我的对象

java - NullPointerException 尝试加载文件

ios - 当标签栏点击两次时禁用自动弹出到 Root View Controller

swift - UIImageView:将多个 UIViewContentMode 属性应用于一个 UIImageView?

swift - Alamofire Swift 3 仅上传数组中的最后一张图片

java - 如何使用注释反序列化时对 Json 进行排序?

ios - 检测 SKAction 是否完成运行,Swift

iOS:在后台获取期间调试 com.apple.NSURLConnectionLoader 线程上的神秘 CFNetwork <redacted> 崩溃