練習紀錄-api上櫃投信買賣超 part1

Astrid
Jul 15, 2021

--

半成品

證券櫃檯買賣中心 OpenAPI

政府資料開放平臺

JSON 在 Swift 裡 print 列印的模樣

想要做出以上的簡單顯示,一直遇到奇怪的問題。我相信那都是因為我觀念操作錯誤。所以在這裡記錄下來。

下載一個Xcode project想參考但它選單中沒有simulator。

print都print不出來,console永遠一片空白。

JSON第一層是Array時,如何解析?

index Out of range

改動了無關的程式碼,卻影響了build出來的結果。

下載一個Xcode project想參考但它選單中沒有simulator。

無法build,後來發現選單中沒有模擬器。

沒有simulator

我試著調整Xcode版本,後來就成功了。
從14.5調整到13.1(調低的概念)

調整Xcode版本

模擬器出現了,選好模擬器後,就可以成功build了。

print都print不出來,console永遠一片空白。

後來發現是我根本沒有把會print出東西的視窗打開。

下面這塊區域叫做debug area。有左右視窗。

左邊是Variables view ,右邊是 debug console。

左邊是Variables view ,右邊是 debug console。

JSON第一層是Array時,如何解析?

上櫃投信買賣超JSON

參考此文章 :利用 JSONDecoder 和 Codable 解析 JSON 和生成自訂型別資料

上櫃投信買賣超JSON是一個Array,Array中的各個Dictionary則儲存每支股票的資訊。

先將每支股票的Dictionary模擬好:

先將每支股票的Dictionary模擬好

接著在下載資料時,直接把下載到資料的型別寫成剛剛寫好的struct加上Array,所以是[FundData]

紅框[FundData]

index Out of range

每次使用tableView時,我都會不斷遇到index Out of range。

看到index Out of range就要檢查:

這個Array是不是空的?

Array中目前的內容狀況?

numberOfRowsInSection 指定的 row數,是否該用別的方式指派?

下圖為,我要顯示theFunds 這個array中的所有物件。一開始不確定theFunds是否有物件在裡面,所以numberOfRowsInSection 我直接先return2。

但結果就是cellForRowAt 這個func中let fund = theFunds[indexPath.row]會顯示indexOutOfRange。

numberOfRowsInSection指定2,cellForRowAt 內的 indexPath.row會indexOutOfRange

我在想是不是2太少了,於是把它改成100。

但還是一樣indexOutOfRange。

numberOfRowsInSection指定100,cellForRowAt 內的 indexPath.row依然indexOutOfRange

後來直接改成整個array中物件的數量theFunds.count,就沒有出現indexOutOfRange了。

numberOfRowsInSection指定theFunds.count,cellForRowAt 內的 indexPath.row不會再出現indexOutOfRange

改動了無關的程式碼,卻影響了build出來的結果。

注意27, 32行

func updateWithIndex(indexPath:IndexPath) 第31行這個func會在viewController中的cellForRowAt被呼叫,然後把indexPath進func,一般來說應該要可以直接在func中被使用。然而build出來是一片空白。

而當我在func外面,先做一個變數。接著在func中把indexPath這個參數的內容存入變數後,我的app build出來了。 雖然第35行dateLabel.text = “\(indexPath.row)” 寫得完全一樣。

做這個練習我遇到的最大瓶頸是,一行程式碼都沒改動,但build出來的app不一樣。本文最開始的那張圖就是唯一成功的一次,之後再build都是長這樣:

也許是我的api處理有我沒發現的問題。接下來也會繼續紀錄。

另外,在viewController中的tableView cell的func cellForRowAt 直接呼叫cell的屬性,直接指定Label上的字從沒成功過。

但在cell那個class內就能成功。

練習紀錄-api上櫃投信買賣超 part2

練習紀錄-api上櫃投信買賣超 part3

--

--