D29 - 用 Swift 和公开资讯,打造投资理财的 Apps { 三大法人成交比重实作.4 }

在上一篇,我们完成了 三大法人 vs. 非三大法人占比。

不过,三大法人占比还可以再用细项来分出,把三大法人中的每个法人占比列出来。

先拉一个红色区域,去放 detail 的 pie chart

https://ithelp.ithome.com.tw/upload/images/20211009/20140622W5M30MDcij.png

一个 pie chart 是细项,一个是 三大法人 vs. 非三大

private lazy var detailPieChartView: PieChartView = {
        let view = PieChartView()
        return view
    }()
    
    private lazy var totalPieChartView: PieChartView = {
        let view = PieChartView()
        return view
    }()

add 两个

private func addPieChart() {
        
        totalPieChartContainer.addSubview(totalPieChartView)
        totalPieChartView.translatesAutoresizingMaskIntoConstraints = false
        totalPieChartView.leadingAnchor.constraint(equalTo: totalPieChartContainer.leadingAnchor).isActive = true
        totalPieChartView.trailingAnchor.constraint(equalTo: totalPieChartContainer.trailingAnchor).isActive = true
        totalPieChartView.topAnchor.constraint(equalTo: totalPieChartContainer.topAnchor).isActive = true
        totalPieChartView.bottomAnchor.constraint(equalTo: totalPieChartContainer.bottomAnchor).isActive = true
        
        detailPieChartContainer.addSubview(detailPieChartView)
        detailPieChartView.translatesAutoresizingMaskIntoConstraints = false
        detailPieChartView.leadingAnchor.constraint(equalTo: detailPieChartContainer.leadingAnchor).isActive = true
        detailPieChartView.trailingAnchor.constraint(equalTo: detailPieChartContainer.trailingAnchor).isActive = true
        detailPieChartView.topAnchor.constraint(equalTo: detailPieChartContainer.topAnchor).isActive = true
        detailPieChartView.bottomAnchor.constraint(equalTo: detailPieChartContainer.bottomAnchor).isActive = true
    }

去要改的 data 只是原来三大法人中的资料,因为已经有每个法人的进出比重,所以只要下方的程序码即可得到每个法人的占比。逻辑和 三大法人 vs. 非三大一样。

/// 计算三大法人各组成占总股市交易的额度
    private func updateDetailPieChartThreeMajorPercentage(chartView: PieChartView) {
        
        guard let twMarketTradingInfo = getMarketTradingInfo(),
              let dealers = totalMajorInvestorInfo?.dealers,
              let securities = totalMajorInvestorInfo?.securitiesInvestorForTrust,
              let foreign = totalMajorInvestorInfo?.foreign,
              let total = totalMajorInvestorInfo?.total else {
            print("找不到和三大法人同日的大盘成交资讯,请检查资料来源")
            return
        }
        
        let dealersTrading = dealers.totalBuy + dealers.totalSell
        let securitiesTrading = securities.totalBuy + securities.totalSell
        let foreignTrading = foreign.totalBuy + foreign.totalSell
        let totalTrading = total.totalBuy + total.totalSell
        let twMarketTrading = twMarketTradingInfo.value ?? 0
        
        let data = getPieChartData(dealersTrading: dealersTrading, securitiesTrading: securitiesTrading, foreignTrading: foreignTrading, totalTrading: totalTrading, twMarketTrading: twMarketTrading)
        chartView.data = data
    }
    
    private func getPieChartData(dealersTrading: Double, securitiesTrading: Double, foreignTrading: Double, totalTrading: Double, twMarketTrading: Double) -> PieChartData {
        
        let threeMajorPercentage = (totalTrading / twMarketTrading) / 2
        let nonMajorPercentage = 1 - threeMajorPercentage
        
        let threeMajorPartial = dealersTrading + securitiesTrading + foreignTrading
        
        let dealersPercentage = dealersTrading * threeMajorPercentage / threeMajorPartial
        let securitiesPercentage = securitiesTrading * threeMajorPercentage / threeMajorPartial
        let foreignPercentage = foreignTrading * threeMajorPercentage / threeMajorPartial
        
        let dealersDataEntry = PieChartDataEntry(value: dealersPercentage, label: "自营商")
        let securitiesDataEntry = PieChartDataEntry(value: securitiesPercentage, label: "投信")
        let foreignDataEntry = PieChartDataEntry(value: foreignPercentage, label: "外资")
        let nonMajorDataEntry = PieChartDataEntry(value: nonMajorPercentage, label: "非三大法人")
        
        let dataSet = PieChartDataSet(entries: [foreignDataEntry, dealersDataEntry, securitiesDataEntry, nonMajorDataEntry])
        dataSet.colors = [.systemRed, .systemGreen, .systemGray, .systemBlue]
        let data = PieChartData(dataSet: dataSet)
        data.setValueTextColor(.darkText)
        return data
    }

接下来,在原来的 button 中,加上这些程序码就完成了

@IBAction func drawPieChartButtonDidTap(_ sender: Any) {
        setup(chartView: self.detailPieChartView)
        setup(chartView: self.totalPieChartView)
        updateDetailPieChartThreeMajorPercentage(chartView: self.detailPieChartView)
        updatePieChartThreeMajorPercentage(chartView: self.totalPieChartView)
    }

完成後的 UI 如下

https://ithelp.ithome.com.tw/upload/images/20211009/20140622WsoNsvwfeo.png


<<:  成员 26 人:企业留才之迷因

>>:  DAY24 这边先帮你上一个按钮喔~(六)

【day3】和牛涮-和牛三吃

和牛涮最近很常出现在朋友的ig画面中 前阵子找时间到忠孝店品嚐 在价位方面 考量炙烧和牛寿司有数量限...

[Day 20] Sass - Using @extend

哈罗~今天来聊聊跟@mixin的兄弟 @extend 我们平常在写css时,时常会把class们相同...

[ 卡卡 DAY 3 ] - React Native 环境建立轻松上手

React Native 我的安装步骤: Node.js,我使用 Homebrew 来安装,所以会先...

DAY5 [C++程序语言简介]

工欲善其事必先利其器,在了解C++之前,下去下载吧!!! 安装Dev C++ [ https://s...

第十四天:初探 Build Scan

众所皆知 Gradle 是一个 Build Tool。对於编译式语言来说,编译过程会经过很多手续,这...