iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

前言

  • 繼使用了 Amplify v2 語法取回 DataStorage 資料後,接著是資料處理的部分。
  • 我們先前在 DataStorage 中,使用了字串來儲存經緯度座標
  • 例如 25.0410334, 121.5246697
  • 然而在先前製作出的 PinLocation 資料結構如下:
    struct PinLocation: Identifiable {
        let id = UUID()
        var name: String
        var image: String
        var coordinate: CLLocationCoordinate2D
        var rank: Int
    
        init(name: String, image: String, coordinate: CLLocationCoordinate2D, rank: Int) {
            self.name = name
            self.image = image
            self.coordinate = coordinate
            self.rank = rank
        }
    
        init() {
            self.name = "秘密釣點 - 五股聖母宮"
            self.image = "default"
            self.coordinate = CLLocationCoordinate2D(latitude:25.1125, longitude:121.4582)
            self.rank = 5   // 1: Bad ~ 5: Good
        }
    }
    
  • 並且已經製作了一個 function 可以將某個 [PinLocation] 地點圖釘的陣列資料釘在地圖上。
  • FishingSpotCoordinate 因為是放在 AWS 的 Amplify 中,這種資料庫並不理解什麼是 CLLocationCoordinate2D 型別。
  • 於是在讀取回資料、放進地點圖釘陣列中的時候,需要轉換資料格式。

實作

  1. 讀取回字串。
  2. 因為透過 Amplify.DataStore.query 可能會讀不到資料(空白資料表或是 filter 不到符合條件的內容),所以他的回傳類型是 Optional
  3. 承上點,Optional String 指的就是,拿到的要不是 String 要不就是 nil⋯⋯
  4. 需要多做一次判斷,是否為 nil。如果是 nil 的話就不能當作字串做拆分處理。
  5. 如果是字串,這邊我假設所有塞進去資料庫的資料,都可以用逗號分割成兩個雙精準度的浮點數。
    let coordinate = spot.coordinate!.split(separator:[",", " "])
    let x = (coordinate[0] as NSString).doubleValue
    let y = (coordinate[1] as NSString).doubleValue
    var imgUrl: String = spot.imageUrl ?? "Empty"
    

分割字串

  • 如同上面顯示的原始碼,先將 SubString 轉換成 NSString,再透過呼叫 doubleValue 變成雙精準度浮點數。

結論

  • 終於搞定透過線上資料庫生成圖釘的功能了
  • 原始碼請見 GitHub

上一篇
【Day 15】 更新 Amplify v2 語法、整合 Async / Await
下一篇
【Day 17】 設計集郵冊的圖床
系列文
依然無法成為釣魚大師也要努力摸魚!!辣個吃魚神器 APP 第二彈33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言