2021-12-20 WWDC(New Swift、Foundation)

What's new in Foundation

1两踏、Apple 專為 Swift 打造了一個新的字符串類型 AttributedString

2连舍、日期和數(shù)字格式化的改進(jìn)

一、屬性字符串 - AttributedString

在 Foundation 框架面世之時蹲蒲,NSAttributedString 類型便隨之一起推出番甩。而今年,Apple 推出了一個基于現(xiàn)代化的 Swift 語言特性的全新的結(jié)構(gòu)體 - AttributedString届搁。

  • 1.1 AttributedString基礎(chǔ)

AttributedString是由字符(Characters)缘薛、區(qū)間(Ranges)、字典(Dictionary)3部分組成卡睦。

AttributedString.png

通過簡單初始化得到AttributedString結(jié)構(gòu)體宴胧,設(shè)置font,foregroundColor表锻,link等屬性恕齐。

AttributeContainer可以根據(jù)不同的AttributedString設(shè)置不同的屬性。

通過調(diào)用 mergeAttributes 方法瞬逊,將攜帶的屬性應(yīng)用在不同的屬性字符串上显歧。

  • 1.2 AttributedString View

訪問AttributedString的組成的三部分,并不是通過訪問AttributedString自身确镊,而是通過View士骤。View由兩部分組成:Characters(字符,用來訪問字符串)骚腥、Runs(用來訪問屬性)敦间。

Characters View

CharactersView.png

首先通過 characters 取出字符 View

遍歷字符 View,并通過 isPunctuation 篩選出字符 View 集合中為標(biāo)點(diǎn)符號的字符束铭,然后設(shè)置其屬性

Runs View

RunsView.png

一個 Run View 包含了一個特定的屬性的起始位置廓块、長度、以及具體的屬性值契沫。

由圖中可以看出 Thank you! Please visit our website. 分別是由"Thank you"带猴、"!"、"Please visit our website"懈万、"." 4部分組成拴清。

  • 1.3 AttributedString & Markdown


    Markdown.png

由上圖可以看到靶病,AttributedString 支持 Markdown 語法

  • 1.4 AttributedString 轉(zhuǎn)換操作

從結(jié)構(gòu)體類型轉(zhuǎn)換為類類型

直接將AttribuedString 傳入 NSAttributedString 的構(gòu)造方法中

var attributedString111 = AttributedString("This is a basic string.")
attributedString111.inlinePresentationIntent = .stronglyEmphasized
label.attributedText = NSAttributedString(attributedString111)

序列化和反序列化

序列化和反序列化.png

因為 AttribuedString 有默認(rèn)的 Codable 實(shí)現(xiàn),這里的 TestAttr 結(jié)構(gòu)體只需要遵循 Codable 協(xié)議即可

二口予、格式化器 - Formatters

DateFormatter.png

通過上面的示例代碼娄周,我們可以看到,原來的我們使用日期格式化器的時候,需要創(chuàng)建一個Formatter沪停,然后傳給Formatter一個日期煤辨,返回一個格式化字符串。iOS15之后木张,有了新的Formatters 語法

2.1 新的 Formatters 語法

新Formatters.png

在最新的 Formatters API 發(fā)布后众辨,我們無需再手動創(chuàng)建并配置 Formatter,同時舷礼,我們也不需要傳給 Formatter 一個日期對象了鹃彻,我么只需要在日期對象身上調(diào)用 formatted 方法,并指定格式化標(biāo)準(zhǔn)是什么妻献。

上面的新Formatters API 更容易理解蛛株,并且可讀性,可維護(hù)性也更高旋奢。

2.2 日期格式化

let date = Date.now
        
var formatted = date.formatted()
// 9/30/2021, 3:31 PM

let standardDate = date.formatted(date: .abbreviated, time: .standard)
// Sep 30, 2021, 3:31:07 PM

let onlyDate = date.formatted(date: .numeric, time: .omitted)
// 9/30/2021

let onlyTime = date.formatted(date: .omitted, time: .shortened)
// 3:31 PM

let formatter1 = date.formatted(.dateTime.year().day().month())
// Sep 30, 2021

let formattedWide = date.formatted(.dateTime.year().day().month(.wide))
// September 30, 2021

let formattedWeekday = date.formatted(.dateTime.weekday(.wide))
// Thursday

let logFormat = date.formatted(.iso8601)
// 2021-09-30T07:31:07Z

let fileNameFormat = date.formatted(.iso8601.year().month().day().dateSeparator(.dash))
// 2021-09-30

let later = date + TimeInterval(6000)

let range = (date..<later).formatted()
// 9/30/21, 3:50?–?5:14 PM

let noDate = (date..<later).formatted(date: .omitted, time: .complete)
// 3:50:43 PM GMT+8?–?5:14:03 PM GMT+8

let timeDuration = (date..<later).formatted(.timeDuration)
// 1:23:20

let components = (date..<later).formatted(.components(style: .wide))
// 1 hour, 23 minutes, 20 seconds

let relative = later.formatted(.relative(presentation: .named, unitsStyle: .wide))
// in 1 hour

let array: [String] = [formatted, standardDate, onlyDate, onlyTime, formatter1, formattedWide, formattedWeekday, logFormat, fileNameFormat, range, noDate, timeDuration, components, relative]

var temp = ""
for str in array {
    temp += str + "\n"
}

print("temp = \(temp)")
formatLabel.text = temp
DataFormatters.png

新的 Formatters API 的一個重要的目標(biāo)是在于創(chuàng)建正確的格式化時提供盡可能多的編譯時支持泳挥。通過指定 formatted 函數(shù)的參數(shù)然痊,可以獲得不同格式的時間表示方式至朗。代碼通過鏈?zhǔn)秸{(diào)用的方式指明需要展示年月日的信息,最終結(jié)果將會根據(jù)用戶的語言環(huán)境 locale 輸出對應(yīng)的內(nèi)容剧浸。字段的順序并不影響锹引,每個字段都只是告訴格式化器在最終的輸出結(jié)果中應(yīng)該包含什么樣的值。

2.3 數(shù)字格式化

let value = 12345
print("value = \(value.formatted())") // 12,345

let percentValue = 30
print("percentValue = \(percentValue.formatted(.percent))") // 30%

let price = 19
print("price = \(price.formatted(.currency(code: "usd")))") // $19.00

let scientific = 42e9
print("scientific = \(scientific.formatted(.number.notation(.scientific)))") // 4.2E10

let list = [25, 50, 75].formatted(.list(memberStyle: .percent, type: .and))
print("list = \(list)") // 25% 50% 75%

數(shù)字格式化支持各種配置唆香,我們可以配置輸出百分比的字符串嫌变,或者是科學(xué)記數(shù)法格式的字符串,亦或者是輸出貨比格式的內(nèi)容躬它。

總結(jié)

  • AttributedString 提供了一個快速的腾啥,易用的并且 Swift 優(yōu)先的接口,進(jìn)而實(shí)現(xiàn)在一個字符串的范圍中添加鍵值對以達(dá)到富文本的效果冯吓。你可以在 SwiftUI 中使用 Text 組件倘待,并在本地化字符串中使用 Markdown 語法。
  • 新的格式器 API 將重點(diǎn)放在格式上组贺,簡化了代碼并提高了性能凸舵。

What's new in UIKit

  • UIButtonConfiguration

我們也可以單獨(dú)定義 UIButtonConfiguration 實(shí)例,并設(shè)置一些諸如文本失尖、圖片等屬性值啊奄,再使用這個實(shí)例來創(chuàng)建按鈕

Style.png
var config = UIButton.Configuration.tinted()
config.title = "測試按鈕"
config.image = UIImage(named: "close")
config.imagePlacement = .trailing
// config.showsActivityIndicator = true
let configBtn = UIButton(configuration: config, primaryAction: nil)
UIButtonConfiguration.png

另外渐苏,我們還可以設(shè)置按鈕的 configurationUpdateHandler,讓按鈕在狀態(tài)發(fā)生改變時自動去執(zhí)行一些操作

configBtn.configurationUpdateHandler = { btn in
    if var config = btn.configuration {
        config.image = btn.isHighlighted ? UIImage(named: "close") : UIImage(named: "back")
        btn.configuration =  config
    }
}
config.showsActivityIndicator = true
Indicator.png

要調(diào)整按鈕布局也很方便菇夸,只需要修改一些屬性值即可,像 baseBackgroundColor琼富、baseForegroundColor、cornerStyle 和 buttonSize 等等庄新。

Style1.png

Style2.png
  • Toggle 按鈕
  • Pop-up 按鈕


    PopBtn.png
  • UIMenu

總結(jié)

以上就是如何在應(yīng)用中更好地使用新版的按鈕公黑,通過配置 UIButtonConfiguration,可以解鎖更豐富的按鈕樣式摄咆,我們不再需要去自己實(shí)現(xiàn) UIButton 子類凡蚜,就可以做很多事情了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吭从,一起剝皮案震驚了整個濱河市朝蜘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涩金,老刑警劉巖谱醇,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異步做,居然都是意外死亡副渴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門全度,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煮剧,“玉大人,你說我怎么就攤上這事将鸵∶阒眩” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵顶掉,是天一觀的道長草娜。 經(jīng)常有香客問我,道長痒筒,這世上最難降的妖魔是什么宰闰? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮簿透,結(jié)果婚禮上移袍,老公的妹妹穿的比我還像新娘。我一直安慰自己萎战,他們只是感情好咐容,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚂维,像睡著了一般戳粒。 火紅的嫁衣襯著肌膚如雪路狮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天蔚约,我揣著相機(jī)與錄音奄妨,去河邊找鬼。 笑死苹祟,一個胖子當(dāng)著我的面吹牛砸抛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播树枫,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼直焙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砂轻?” 一聲冷哼從身側(cè)響起奔誓,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搔涝,沒想到半個月后厨喂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庄呈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年蜕煌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诬留。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斜纪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出故响,到底是詐尸還是另有隱情傀广,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布彩届,位于F島的核電站,受9級特大地震影響誓酒,放射性物質(zhì)發(fā)生泄漏樟蠕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一靠柑、第九天 我趴在偏房一處隱蔽的房頂上張望寨辩。 院中可真熱鬧,春花似錦歼冰、人聲如沸靡狞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甸怕。三九已至甘穿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梢杭,已是汗流浹背温兼。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留武契,地道東北人募判。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像咒唆,于是被迫代替她去往敵國和親届垫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容