最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

SwiftUI學(xué)習(xí)100天(Day77 - 里程碑:項(xiàng)目 13 - 15)

2023-03-22 12:00 作者:愛上樹の蝸牛  | 我要投稿

原創(chuàng)鏈接:https://www.hackingwithswift.com/100/swiftui

以下內(nèi)容僅供學(xué)習(xí)參考:

在我們處理 UIKit 和 SwiftUI 集成的各個(gè)部分時(shí),你已經(jīng)完成了幾個(gè)困難的項(xiàng)目,所以讓我們暫停一下,回顧一下學(xué)到的東西。

今天是時(shí)候停下來反思一下所涵蓋的內(nèi)容了。我們還將更詳細(xì)地深入探討兩個(gè)主題——運(yùn)算符重載和屬性包裝器,因?yàn)檫@樣做你將對(duì)我們一直在使用的內(nèi)容有更深入的了解。還有今天的挑戰(zhàn),你需要運(yùn)用所學(xué)的技能來構(gòu)建全新的應(yīng)用程序。

挑戰(zhàn)為你提供了以實(shí)際方式測(cè)試你的學(xué)習(xí)的機(jī)會(huì),為你提供了一個(gè)沙盒,你可以在其中真正表達(dá)自己并根據(jù)需要擴(kuò)展自己,我希望也能向你展示當(dāng)你下定決心時(shí)的能力它。正如 Cicely Tyson 所說,“挑戰(zhàn)會(huì)讓你發(fā)現(xiàn)你從未真正了解過的自己,”我希望你今天能夠發(fā)現(xiàn)你已經(jīng)走了多遠(yuǎn)!

今天你有三個(gè)主題要完成,其中之一是你的挑戰(zhàn)。

你學(xué)到了什么

這些項(xiàng)目開始向你介紹 SwiftUI 中更困難的部分,盡管這些都不是真正的 SwiftUI 的錯(cuò)——正是 SwiftUI 與 Apple 的舊框架相遇的地方讓事情變得有點(diǎn)艱難。隨著時(shí)間的推移,這些粗糙的邊緣會(huì)變得平滑一些,但可能需要幾年時(shí)間,而且無論如何,對(duì)于任何時(shí)候你想要集成來自 Apple 外部的代碼,這些仍然很重要。

在完成這三個(gè)項(xiàng)目的同時(shí),你還了解到:

  • 屬性包裝器如何成為結(jié)構(gòu)體

  • 顯示帶有大量按鈕的確認(rèn)對(duì)話框

  • 使用 Core Image 操作圖像

  • 集成PHPickerViewController到 SwiftUI

  • 編寫可以充當(dāng)圖像選擇器委托的協(xié)調(diào)器類

  • 將地圖集成到 SwiftUI 中

  • 在地圖上放置圖釘

  • 將圖像保存到用戶的照片庫

  • 添加對(duì)自定義類型Comparable的一致性

  • 查找并寫入用戶的文檔目錄

  • 寫入時(shí)啟用文件加密

  • 使用 Touch ID 和 Face ID 對(duì)用戶進(jìn)行身份驗(yàn)證

這些主題中的每一個(gè)都作為一個(gè)獨(dú)立的技術(shù)進(jìn)行了介紹,然后應(yīng)用到一個(gè)真實(shí)的項(xiàng)目中,所以希望它能真正融入其中!


關(guān)鍵點(diǎn)

今天我想深入探討兩個(gè)主題,這兩個(gè)主題都非常高級(jí),但我知道它們確實(shí)有助于加深你對(duì)前三個(gè)項(xiàng)目所涵蓋內(nèi)容的理解。


運(yùn)算符重載

當(dāng)我們添加自定義一致性Comparable時(shí),我們需要添加一個(gè)名為<.?這反過來又允許 Swift 比較諸如 a < b之類的表達(dá)式,這使我們能夠訪問sorted()不帶參數(shù)的版本。

這稱為運(yùn)算符重載,它允許我們使用相同的+運(yùn)算符添加兩個(gè)整數(shù)或連接兩個(gè)字符串。如果需要,你可以定義自己的運(yùn)算符,但擴(kuò)展現(xiàn)有運(yùn)算符來執(zhí)行新操作也很容易。

例如,我們可以添加一些擴(kuò)展Int,讓我們將一個(gè)Int和一個(gè)Double相乘——這是 Swift 默認(rèn)不允許的,這可能很煩人:

請(qǐng)?zhí)貏e注意參數(shù):它使用 一個(gè)Int作為左手操作數(shù)和 一個(gè)Double作為右手操作數(shù),這意味著如果你交換這兩個(gè)參數(shù),它將無法工作。所以,如果你想要完整——如果你想讓任何一個(gè)命令都起作用——你需要定義方法兩次。

然而,如果你想要真正的完整,那么擴(kuò)展Int是錯(cuò)誤的選擇:我們應(yīng)該使用一個(gè)協(xié)議來包裝Int以及其他整數(shù)類型,比如我們?cè)?Core Data 中使用的Int16。Swift 將所有整數(shù)類型放入一個(gè)名為 BinaryInteger的協(xié)議中,如果我們?cè)谄渖暇帉憯U(kuò)展,則Self(使用大寫 S)指代正在使用的任何特定類型。所以,如果它用在Int上,則Self意味著Int,如果它用在Int16?上,則意味著它被替代。

下面是一個(gè)拓展,它在任何類型的整數(shù)和Double之間添加*,無論整數(shù)是在左邊還是右邊:

如果你想知道,Swift 不為我們啟用這些運(yùn)算符是有原因的:它不能保證像你希望的那樣準(zhǔn)確。作為一個(gè)簡(jiǎn)單的例子,試試這個(gè):

這將創(chuàng)建一個(gè) 64 位整數(shù),其中包含 50 千萬億零一。然后使用我們的自定義擴(kuò)展將它乘以Double?1.0,這在理論上意味著返回的數(shù)字應(yīng)該與Int.?但是,該String(format:_:)調(diào)用要求打印沒有小數(shù)位的數(shù)字,你會(huì)發(fā)現(xiàn)它與整數(shù)不同:它是 50 千萬億,沒有 1?,F(xiàn)在,你可能會(huì)問“什么是 1,當(dāng)你正在使用 50 quadrillion”,這很好——我在這里不是要告訴你什么是對(duì)的,什么是錯(cuò)的,只是說如果你想要絕對(duì)的準(zhǔn)確性,你應(yīng)該避免使用這些輔助方法。

更一般地說,我想給你一個(gè)關(guān)于運(yùn)算符重載的警告。當(dāng)我在項(xiàng)目 14 中介紹它時(shí),我說過運(yùn)算符重載“既是福也是禍”,我想簡(jiǎn)要地談?wù)劄槭裁磿?huì)這樣。

考慮這樣的代碼:

result是什么類型的數(shù)據(jù)?我可以想到幾種可能性:

  1. 也許它是另一個(gè)User對(duì)象,現(xiàn)在經(jīng)過修改,以便在其已知語言數(shù)組中包含 Swift。

  2. 也許它是一個(gè)Programmer結(jié)合了用戶和語言的對(duì)象。

  3. 也許這是對(duì)經(jīng)典恐怖電影 The Fly 的奇怪翻拍。

關(guān)鍵是我們不知道,如果不閱讀相關(guān)+運(yùn)算符的源代碼,我們就無法真正分辨出來。

現(xiàn)在考慮這段代碼:

我認(rèn)為這更清楚了:我們現(xiàn)在正在一個(gè)對(duì)象上運(yùn)行一個(gè)簡(jiǎn)單的方法,你可能會(huì)猜到我們正在變異paul以將 Swift 包含在編程語言的數(shù)組中。

任何優(yōu)秀的開發(fā)人員都會(huì)告訴你,清晰度是編寫良好的代碼最重要的特征之一——我們需要在編寫的內(nèi)容中明確表達(dá)我們的意思,因?yàn)樗鼘頃?huì)被閱讀數(shù)十或數(shù)百次。

因此,一定要將運(yùn)算符重載添加到你可以用來解決問題的技能庫中,事實(shí)上,我在我的《Pro Swift?》一書中對(duì)它們進(jìn)行了更詳細(xì)的介紹,但始終要小心使用它們。


自定義屬性包裝器

你已經(jīng)看到屬性包裝器實(shí)際上只是一些技巧:它們采用一個(gè)簡(jiǎn)單的值并將其包裝在另一個(gè)值中,以便可以添加一些額外的功能。這可能是 SwiftUI 用@State在別處存儲(chǔ)值的方式,或者它用@Environment從共享數(shù)據(jù)源讀取值的方式,但原理是相同的:它采用一個(gè)簡(jiǎn)單的值并以某種方式賦予它超能力。

我們可以在自己的代碼中使用屬性包裝器,你可能想要這樣做的原因有很多。與運(yùn)算符重載一樣,如果你嘗試過它們,你將更了解它們是如何工作的,但也值得深思熟慮地使用它們:如果它們是你首先接觸到的東西,你可能會(huì)犯錯(cuò)誤。

為了演示屬性包裝器,我想從一個(gè)包裝某種BinaryInteger值的簡(jiǎn)單結(jié)構(gòu)開始。當(dāng)涉及到設(shè)置它的包裝值時(shí),我們將給它一些自定義代碼,這樣如果新值低于 0,我們就會(huì)將它精確地設(shè)置為 0,這樣這個(gè)結(jié)構(gòu)就永遠(yuǎn)不會(huì)為負(fù)。

我們的代碼看起來像這樣:

我們現(xiàn)在可以用一個(gè)整數(shù)來創(chuàng)建它,但如果該整數(shù)低于 0,那么它將被固定為 0。因此,這將打印 0:

屬性包裝器讓我們做的是將其用于結(jié)構(gòu)或類中的任何類型的屬性。更好的是,它只需要一個(gè)步驟:在結(jié)構(gòu)體NonNegative之前編寫@propertyWrapper,如下所示:

就是這樣——我們現(xiàn)在有了自己的屬性包裝器!

如果你沒有從他們的名字中猜到,屬性包裝器只能用于屬性而不是普通變量或常量,所以為了嘗試我們的,我們將把它放在這樣的User結(jié)構(gòu)中:

現(xiàn)在我們可以創(chuàng)建一個(gè)用戶并自由添加或刪除分?jǐn)?shù),確定分?jǐn)?shù)永遠(yuǎn)不會(huì)低于 0:

如你所見,這里真的沒有魔法:屬性包裝器不僅只是語法糖,可以使一個(gè)數(shù)據(jù)包裹另一個(gè)數(shù)據(jù),而且如果需要,我們也可以自己制作它們。


挑戰(zhàn)

你是否曾經(jīng)參加過會(huì)議或聚會(huì),與新認(rèn)識(shí)的人聊天,然后在你走開幾秒鐘后意識(shí)到呢已經(jīng)忘記了他們的名字?你并不孤單,你今天構(gòu)建的應(yīng)用程序?qū)⒂兄诮鉀Q該問題和其他類似問題。

你的目標(biāo)是構(gòu)建一個(gè)應(yīng)用程序,要求用戶從他們的照片庫中導(dǎo)入圖片,然后為他們導(dǎo)入的任何內(nèi)容附加一個(gè)名稱。他們命名的完整圖片集應(yīng)顯示在 List,點(diǎn)擊列表中的項(xiàng)目應(yīng)顯示帶有較大版本圖片的詳細(xì)信息屏幕。

分解它,你應(yīng)該:

  • 包裹PHPickerViewController,以便它可以用來選擇照片。

  • 檢測(cè)何時(shí)導(dǎo)入新照片,并立即要求用戶為照片命名。

  • 將該名稱和照片保存在安全的地方。

  • 在列表中顯示所有姓名和照片,按姓名排序。

  • 創(chuàng)建一個(gè)顯示全尺寸圖片的詳細(xì)信息屏幕。

  • 確定保存所有這些數(shù)據(jù)的方法。

我們已經(jīng)介紹了如何使用 UIImageWriteToSavedPhotosAlbum()將數(shù)據(jù)保存到用戶的照片庫,但是將圖像保存到磁盤需要一個(gè)小的額外步驟:你需要UIImage通過Data調(diào)用它的jpegData()方法將你的轉(zhuǎn)換為:

compressionQuality參數(shù)可以是 0(極低質(zhì)量)和 1(最高質(zhì)量)之間的任何值;0.8 之類的值可以在大小和質(zhì)量之間進(jìn)行很好的權(quán)衡。

如果你愿意,你可以為這個(gè)項(xiàng)目使用核心數(shù)據(jù),但這不是必需的——一個(gè)簡(jiǎn)單的 JSON 文件寫到文檔目錄就可以了,盡管你需要添加一個(gè)自定義的Comparable一致性來讓數(shù)組排序工作。

如果你確實(shí)選擇使用 Core Data,請(qǐng)確保你沒有將實(shí)際圖像保存到數(shù)據(jù)庫中,因?yàn)槟菢有什桓?。不管是否?Core Data,最佳做法是為圖像文件名生成一個(gè)新UUID文件名,然后將其寫入文檔目錄,并將其UUID存儲(chǔ)在數(shù)據(jù)模型中。

請(qǐng)記住,你已經(jīng)知道完成這項(xiàng)工作所需的一切——祝你好運(yùn)!



SwiftUI學(xué)習(xí)100天(Day77 - 里程碑:項(xiàng)目 13 - 15)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
陆丰市| 郴州市| 哈密市| 涿鹿县| 龙陵县| 拜城县| 大足县| 伊川县| 贺兰县| 怀宁县| 锦州市| 彩票| 萨迦县| 宜兰市| 汉沽区| 嘉峪关市| 察哈| 岳普湖县| 红安县| 休宁县| 博乐市| 宁波市| 靖州| 叶城县| 黄浦区| 皮山县| 牙克石市| 仁寿县| 潢川县| 万全县| 翁源县| 长子县| 崇左市| 长治市| 富阳市| 繁昌县| 芜湖县| 井冈山市| 临汾市| 克拉玛依市| 镇平县|