最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift 圖表使用Foudation庫中測量類型詳解

 更新時間:2022年10月27日 10:39:23   作者:Swift社區(qū)  
這篇文章主要為大家介紹了Swift 圖表使用Foudation庫中測量類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

在這篇文章中,我們將建立一個條形圖,比較基督城地區(qū)自然散步的持續(xù)時間。我們將使用今年推出的新的Swift Charts 框架,并將看到如何繪制默認不符合 Plottable 協(xié)議的類型的數據,如 Measurement<UnitDuration>

定義圖表的數據

讓我們先定義一下要在圖表中展現的數據。

我們聲明了一個包含標題和步行時間(小時)的 Walk 結構體。我們使用 Foundation 框架中的測量類型Measurement和單位類型UnitDuration來表示每次步行的時間。

struct Walk {
    let title: String
    let duration: Measurement<UnitDuration>
}

我們在數組 works 中存儲要在圖表中顯示的數據。

let walks = [
    Walk(
        title: "Taylors Mistake to Sumner Beach Coastal Walk",
        duration: Measurement(value: 3.1, unit: .hours)
    ),
    Walk(
        title: "Bottle Lake Forest",
        duration: Measurement(value: 2, unit: .hours)
    ),
    Walk(
        title: "Old Halswell Quarry Loop",
        duration: Measurement(value: 0.5, unit: .hours)
    ),
    ...
]

在圖表中使用測量值

嘗試直接在圖表中使用測量值

讓我們定義一個 Chart,并將 walks 數組作為數據參數傳遞給它。因為我們知道我們的walk 標題是唯一的,所以我們可以直接使用它們作為 id,但你也可以將你的數據模型改為 Identifiable

Chart(walks, id: \.title) { walk in
    BarMark(
        x: .value("Duration", walk.duration),
        y: .value("Walk", walk.title)
    )
}

注意,因為 Measurement<UnitDuration> 沒有遵守 Plottable 協(xié)議,我們會得到一個錯誤:「Initializer 'init(x:y:width:height:stacking:)' requires that 'Measurement' conform to 'Plottable'」

BarkMark 的初始化器期望收到一個用于 x 和 y 的 PlottableValue 參數。而且 PlottableValue 的值類型必須符合 Plottable 協(xié)議。

我們有幾個選擇來解決這個錯誤。我們可以提取測量值的 value,它是一個 Double 類型,它是默認符合 Plottable 的,我們可以擴展具有 Plottable 一致性的 Measurement<UnitDuration>,或者我們可以定義一個包裝了測量的類型并使其符合 Plottable 協(xié)議。

如果我們簡單地從測量值中提取,我們就會失去上下文,不知道用什么單位來創(chuàng)建測量值。這意味著,我們將無法正確格式化圖表的標簽來向用戶表示單位。雖然我們可以記住我們在創(chuàng)建測量時使用了小時 hours,但這并不理想。例如,我們可以決定以后改變數據模型,以分鐘為單位存儲持續(xù)時間,或者數據可能來自其他地方,所以手動重構單位并不是一個完美的解決方案。

Plottable 的一致性來擴展 Measurement<UnitDuration> 是可行的,但根據 Swift 中關于外部類型的追溯一致性的警告 (Warning for Retroactive Conformances of External Types),如果 Swift Charts 在未來添加了這種一致性,它可能會被破壞。

我們將研究如何定義我們自己的類型來包裝 measurement,并為我們的自定義類型添加 Plottable 的一致性。

設計一個包裝器類型

設計一個符合 Plottable 標準的包裝器類型

我們將定義一個自定義的 PlottableMeasurement 類型,并使其成為通用的,所以它可以容納任何類型的單位的測量類型。

struct PlottableMeasurement<UnitType: Unit> {
    var measurement: Measurement<UnitType>
}

然后,我們將為 PlottableMeasurement 添加 Plottable 的一致性,其單位為 UnitDuration 類型。我們可以在將來添加對其他單位的支持。

extension PlottableMeasurement: Plottable where UnitType == UnitDuration {
    var primitivePlottable: Double {
        self.measurement.converted(to: .minutes).value
    }
    init?(primitivePlottable: Double) {
        self.init(
            measurement: Measurement(
                value: primitivePlottable,
                unit: .minutes
            )
        )
    }
}

Plottable 協(xié)議有兩個要求: primitivePlottable 屬性必須返回原始類型之一,如 Double、StringDate,以及一個可失敗的初始化器,從原始 plottable 類型創(chuàng)建一個值。

我決定將測量值轉換為分鐘,但你可以選擇適合你需要的任何其他單位。只是在與原始值轉換時要使用相同的單位,這一點很重要。

我們現在可以更新我們的圖表,以使用我們的自定義 Plottable 類型。

Chart(walks, id: \.title) { walk in
    BarMark(
        x: .value(
            "Duration",
            PlottableMeasurement(measurement: walk.duration)
        ),
        y: .value("Walk", walk.title)
    )
}

它可以工作,但X軸上的標簽沒有格式化,沒有向用戶顯示測量單位。我們接下來要解決這個問題。

顯示格式化標簽

顯示帶有測量單位的格式化標簽

為了定制X軸上的標簽,我們將使用chartXAxis(content:)修改器,并用傳遞給我們的值重構x軸的標記。

Chart(walks, id: \.title) { ... }
    .chartXAxis {
        AxisMarks { value in
            AxisGridLine()
            AxisValueLabel("""
            \(value.as(PlottableMeasurement.self)!
                .measurement
                .converted(to: .hours),
            format: .measurement(
                width: .narrow,
                numberFormatStyle: .number.precision(
                    .fractionLength(0))
                )
            )
            """)
        }
    }

我們首先添加網格線,然后重構給定值的標簽。

AxisValueLabel在初始化器中接受一個LocalizedStringKey,它可以通過插值測量和指定其格式風格來構建。

我們收到的值是使用我們在 Plottable 一致性中定義的初始化器創(chuàng)建的,所以在我們的案例中,測量值是以分鐘為單位提供的。但我相信對于這個特定的圖表,使用小時會更好。我們可以很容易地將測量值轉換為插值內部所需的單位。在這里,我們確定該值是 PlottableMeasurement 類型的,所以我們可以強制解包類型轉換。

我選擇了縮小的格式和小數點后零位數作為數字樣式,但你可以根據你的具體圖表調整這些設置。

最后的結果是在X軸上顯示以小時為單位的格式化持續(xù)時間。

你可以從我們的 GitHub repo 中獲得這篇文章中使用的項目的完整 示例代碼

以上就是Swift 圖表使用Foudation庫中測量類型詳解的詳細內容,更多關于Swift 圖表Foudation庫測量類型的資料請關注腳本之家其它相關文章!

相關文章

  • Swift 中如何使用 Option Pattern 改善可選項的 API 設計

    Swift 中如何使用 Option Pattern 改善可選項的 API 設計

    這篇文章主要介紹了Swift 中如何使用 Option Pattern 改善可選項的 API 設計,幫助大家更好的進行ios開發(fā),感興趣的朋友可以了解下
    2020-10-10
  • Swift自定義UITableViewCell背景色

    Swift自定義UITableViewCell背景色

    這篇文章主要為大家詳細介紹了Swift自定義UITableViewCell背景色,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 淺談在Swift中關于函數指針的實現

    淺談在Swift中關于函數指針的實現

    這篇文章主要介紹了淺談在Swift中關于函數指針的實現,是作者根據C語言的指針特性在Swifft中做出的一個實驗,需要的朋友可以參考下
    2015-07-07
  • swift 4自定義UITableCell的方法示例

    swift 4自定義UITableCell的方法示例

    這篇文章主要給大家介紹了關于swift 4自定義UITableCell的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • swift中c風格的for循環(huán)執(zhí)行效率

    swift中c風格的for循環(huán)執(zhí)行效率

    這篇文章主要介紹了swift中c風格的for循環(huán)執(zhí)行效率 的相關資料,需要的朋友可以參考下
    2016-07-07
  • Swift TableView實現凍結窗格功能

    Swift TableView實現凍結窗格功能

    這篇文章主要為大家詳細介紹了Swift TableView實現凍結窗格功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Swift編程中的初始化與反初始化完全講解

    Swift編程中的初始化與反初始化完全講解

    這篇文章主要介紹了Swift編程中的初始化與反初始化完全講解,是Swift入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • Swift算法實現逐字翻轉字符串的方法示例

    Swift算法實現逐字翻轉字符串的方法示例

    大家都知道翻轉字符串在字符串算法中算是比較常見的,下面這篇文章主要介紹了Swift算法實現逐字翻轉字符串的方法,文中給出了詳細的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Swift中初始化方法的順序介紹

    Swift中初始化方法的順序介紹

    這篇文章主要介紹了Swift中初始化方法的順序介紹,本文介紹的是了類的初始化方法,需要的朋友可以參考下
    2015-01-01
  • 利用Swift實現各類的CATransition動畫詳解

    利用Swift實現各類的CATransition動畫詳解

    CATransition動畫主要在過渡時使用,比如兩個頁面層級改變的時候添加一個轉場效果。CATransition分為兩類,一類是公開的動畫效果,一類是非公開的動畫效果。這篇文章主要給大家介紹了關于如何利用Swift實現各類CATransition動畫的相關資料,需要的朋友可以參考下。
    2017-09-09

最新評論

大同市| 广平县| 宁晋县| 牟定县| 玉龙| 娱乐| 炉霍县| 旬邑县| 巫溪县| 汝南县| 天台县| 乌拉特前旗| 巴彦淖尔市| 邢台市| 吉木萨尔县| 武威市| 平昌县| 鲁山县| 常熟市| 乳源| 怀集县| 临泉县| 广宗县| 文昌市| 友谊县| 静海县| 历史| 九龙县| 灵石县| 荆门市| 斗六市| 寻乌县| 子洲县| 慈溪市| 驻马店市| 黔西| 桦甸市| 铜鼓县| 惠来县| 民丰县| 锦州市|