欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift 圖表使用Foudation庫(kù)中測(cè)量類(lèi)型詳解

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

前言

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

定義圖表的數(shù)據(jù)

讓我們先定義一下要在圖表中展現(xiàn)的數(shù)據(jù)。

我們聲明了一個(gè)包含標(biāo)題和步行時(shí)間(小時(shí))的 Walk 結(jié)構(gòu)體。我們使用 Foundation 框架中的測(cè)量類(lèi)型Measurement和單位類(lèi)型UnitDuration來(lái)表示每次步行的時(shí)間。

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

我們?cè)跀?shù)組 works 中存儲(chǔ)要在圖表中顯示的數(shù)據(jù)。

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)
    ),
    ...
]

在圖表中使用測(cè)量值

嘗試直接在圖表中使用測(cè)量值

讓我們定義一個(gè) Chart,并將 walks 數(shù)組作為數(shù)據(jù)參數(shù)傳遞給它。因?yàn)槲覀冎牢覀兊?code>walk 標(biāo)題是唯一的,所以我們可以直接使用它們作為 id,但你也可以將你的數(shù)據(jù)模型改為 Identifiable。

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

注意,因?yàn)?Measurement<UnitDuration> 沒(méi)有遵守 Plottable 協(xié)議,我們會(huì)得到一個(gè)錯(cuò)誤:「Initializer 'init(x:y:width:height:stacking:)' requires that 'Measurement' conform to 'Plottable'」

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

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

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

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

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

設(shè)計(jì)一個(gè)包裝器類(lèi)型

設(shè)計(jì)一個(gè)符合 Plottable 標(biāo)準(zhǔn)的包裝器類(lèi)型

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

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

然后,我們將為 PlottableMeasurement 添加 Plottable 的一致性,其單位為 UnitDuration 類(lèi)型。我們可以在將來(lái)添加對(duì)其他單位的支持。

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é)議有兩個(gè)要求: primitivePlottable 屬性必須返回原始類(lèi)型之一,如 Double、StringDate,以及一個(gè)可失敗的初始化器,從原始 plottable 類(lèi)型創(chuàng)建一個(gè)值。

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

我們現(xiàn)在可以更新我們的圖表,以使用我們的自定義 Plottable 類(lèi)型。

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

它可以工作,但X軸上的標(biāo)簽沒(méi)有格式化,沒(méi)有向用戶顯示測(cè)量單位。我們接下來(lái)要解決這個(gè)問(wèn)題。

顯示格式化標(biāo)簽

顯示帶有測(cè)量單位的格式化標(biāo)簽

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

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))
                )
            )
            """)
        }
    }

我們首先添加網(wǎng)格線,然后重構(gòu)給定值的標(biāo)簽。

AxisValueLabel在初始化器中接受一個(gè)LocalizedStringKey,它可以通過(guò)插值測(cè)量和指定其格式風(fēng)格來(lái)構(gòu)建。

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

我選擇了縮小的格式和小數(shù)點(diǎn)后零位數(shù)作為數(shù)字樣式,但你可以根據(jù)你的具體圖表調(diào)整這些設(shè)置。

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

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

以上就是Swift 圖表使用Foudation庫(kù)中測(cè)量類(lèi)型詳解的詳細(xì)內(nèi)容,更多關(guān)于Swift 圖表Foudation庫(kù)測(cè)量類(lèi)型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入解析Swift編程中枚舉類(lèi)型的相關(guān)使用

    深入解析Swift編程中枚舉類(lèi)型的相關(guān)使用

    這篇文章主要介紹了Swift編程中枚舉類(lèi)型的相關(guān)使用,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Swift中static和class關(guān)鍵字的深入講解

    Swift中static和class關(guān)鍵字的深入講解

    這篇文章主要給大家介紹了關(guān)于Swift中static和class關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 快速排序算法在Swift編程中的幾種代碼實(shí)現(xiàn)示例

    快速排序算法在Swift編程中的幾種代碼實(shí)現(xiàn)示例

    快速排序是一種不穩(wěn)定的排序,存在著優(yōu)化空間,這里我們來(lái)看快速排序算法在Swift編程中的幾種代碼實(shí)現(xiàn)示例:
    2016-07-07
  • 詳解如何在SwiftUI中創(chuàng)建懸浮操作按鈕

    詳解如何在SwiftUI中創(chuàng)建懸浮操作按鈕

    懸浮操作按鈕(Floating Action Button, FAB)是一種在 Android 和 Material Design 中使用的 UI 元素,它用于觸發(fā)特定屏幕的主要操作,下面我們就來(lái)詳細(xì)介紹一下如何在SwiftUI中創(chuàng)建懸浮操作按鈕,需要的朋友可以參考下
    2023-10-10
  • Swift實(shí)現(xiàn)快速排序算法的代碼示例

    Swift實(shí)現(xiàn)快速排序算法的代碼示例

    這篇文章主要介紹了Swift實(shí)現(xiàn)快速排序算法的代碼示例,首先利用分治法講解了快速排序的思路,需要的朋友可以參考下
    2016-07-07
  • Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能

    Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能

    這篇文章主要給大家介紹了關(guān)于Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面隨著小編來(lái)一起看看吧
    2018-05-05
  • Swift實(shí)現(xiàn)Selection Sort選擇排序算法的實(shí)例講解

    Swift實(shí)現(xiàn)Selection Sort選擇排序算法的實(shí)例講解

    選擇排序是一種穩(wěn)定的排序算法,且實(shí)現(xiàn)代碼通常比冒泡排序要來(lái)的簡(jiǎn)單,這里我們就來(lái)看一下Swift實(shí)現(xiàn)Selection Sort選擇排序的實(shí)例講解
    2016-07-07
  • Swift Set集合及常用方法詳解總結(jié)

    Swift Set集合及常用方法詳解總結(jié)

    Set集合為集類(lèi)型,集是最簡(jiǎn)單的一種集合,存放于集中的對(duì)象不按特定方式排序,只是簡(jiǎn)單地把對(duì)象加入集合中,類(lèi)似于向口袋里放東西,對(duì)集中存在的對(duì)象的訪問(wèn)和操作是通過(guò)對(duì)象的引用進(jìn)行的,因此在集中不能存放重復(fù)對(duì)象
    2021-11-11
  • Swift源碼解析之弱引用

    Swift源碼解析之弱引用

    這篇文章主要給大家介紹了關(guān)于Swift源碼解析之弱引用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Swift循環(huán)遍歷集合的方法總結(jié)分享

    Swift循環(huán)遍歷集合的方法總結(jié)分享

    SWIFT是蘋(píng)果于2014年WWDC發(fā)布的新開(kāi)發(fā)語(yǔ)言,可與Objective-C*共同運(yùn)行于Mac OS和iOS平臺(tái),用于搭建基于蘋(píng)果平臺(tái)的應(yīng)用程序。這篇文章主要給大家總結(jié)介紹了關(guān)于Swift循環(huán)遍歷集合的方法,如for-in循環(huán)、for循環(huán)以及基于塊的遍歷等方法,需要的朋友可以參考下。
    2017-03-03

最新評(píng)論