iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
tags: 釣魚術 swift swiftui

本日目標

  • 弄清楚 Swift Wrapper - @Published
  • 看文件怎麼說明 ObservableObject

摘要

  • 我們在創造這個地圖功能時,可以發現一些現象:
    • 瀏覽地圖、會改變地圖顯示的經緯度;縮放地圖、會改變地圖的比例尺。不過單就此功能的話,我們不需要理會、讀取或是操縱這個地圖外觀的屬性。
    • 不過當我們希望「按下一個按鈕後,地圖會顯示當前所在區域」,要完成這個動作,需要把當前的座標,扔入 Map() 中。於似乎我們需要在使用一個或多個變數,來存放這個變動資料,並且在資料修改後,更新地圖的外觀。
  • 另外,你不會希望有人可以亂改這個地圖座標,因為地圖畫面,它含有的內容至少就有 centerspan 兩種內容,範例中,我使用 region 來記錄。
  • class FishingLocationModel 的時候,希望透過這個 class 實作出來的實例,記錄地圖外觀的經緯度和顯示的比例尺資訊。
  • 對於物件導向有開發經驗的兄弟姐妹,一定對於「屬性」及「方法」不陌生。
  • 不過,我們並不希望有奇怪的東西直接存取物件的屬性。理想的做法就是盡量讓這個屬性數值,用符合這個數字邏輯進行修改。
    • 舉個例子,你拿一千塊出來當作兩個小孩子的零用錢。小孩子要將這個鈔票「平分」,總不能拿剪刀從中間喀擦下去吧?!
  • 而更新地圖畫面,使用者會頻繁滑動縮放地圖,每完成一個動作,要不改變顯示的地圖中心位置,要不就是更動了地圖的顯示比例。這樣的更動發生時,就要重新產生 MKCoordinateRegion

使用 @PublishedObservableObject

發送物件的 property

  • @Published
    • A type that publishes a property marked with an attribute.
    • 我們需要將定義一個專屬於 View 的 Model物件,並將其中的座標傳遞給 View
    • var region 這個變數前面加上 @Published wrapper 以將此變數的修改送出
    @Published var region = MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: 25.1125, longitude: 121.4582),
            span: MKCoordinateSpan(latitudeDelta: 0.008, longitudeDelta: 0.008))
    
  • ObservableObject
    • A type of object with a publisher that emits before the object has changed.
    • 當物件要發生改變數,物件中附帶的 publisher 會送出訊號 ... 送訊號幹嘛咧?叫別人更新內容啊,例如更新顯示的地圖。
    • 我們在先前修改的程式碼中,可以發現此關鍵字僅出現在繼承 class 一段。其目的便是為了得到該 ObservableObject 所定義好的方法。

心得

  • 沒有什麼問題是看一遍文件解不了的問題,如果有的話,就報名鐵人賽吧

技術債


上一篇
【Day 11】Swift UI - MapKit 與 CoreLocation 的使用
下一篇
【Day 13】Swift 擷取螢幕手勢
系列文
無法成為釣魚大師也要努力摸魚!!辣個吃魚神器 APP38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言