Swift5.4新特性

公眾號-知識小集

改進(jìn)的隱式成員語法

在 Swift 5.4 之前,如果您希望紅色略微透明,則需要編寫以下代碼:

struct ContentView: View {
    var body: some View {
        Text("You're not my supervisor!")
            .foregroundColor(Color.red.opacity(0.5))
    }
}

從 Swift 5.4 起都弹,編譯器可以支持多個鏈?zhǔn)降某蓡T,這意味著可以推斷 Color 類型:

struct ContentView: View {
    var body: some View {
        Text("You're not my supervisor!")
            .foregroundColor(.red.opacity(0.5))
    }
}

函數(shù)中的多個可變參數(shù)

Swift 5.4 之前匙姜,只能有一個可變參數(shù)。

Swift 5.4 框杜,可有多個可變參數(shù)梧乘。

例子:
編寫一個函數(shù)來接受一個可變參數(shù)仁堪,該參數(shù)存儲足球比賽期間進(jìn)球的時間,以及第二個可變參數(shù)贸铜,用于對得分球員的姓名進(jìn)行評分

func summarizeGoals(times: Int..., players: String...) {
    let joinedNames = ListFormatter.localizedString(byJoining: players)
    let joinedTimes = ListFormatter.localizedString(byJoining: times.map(String.init))

    print("\(times.count) goals where scored by \(joinedNames) at the follow minutes: \(joinedTimes)")
}

調(diào)用該函數(shù)
summarizeGoals(times: 18, 33, 55, 90, players: "Dani", "Jamie", "Roy")

Result 構(gòu)建器

// This is invalid Swift, and will not compile.
 func makeSentence2() -> String {
     "Why settle for a Duke"
     "when you can have"
     "a Prince?"
 }

上面的代碼將無法工作悴灵,因為 Swift 不理解我們的意思。但是骂蓖,我們可以創(chuàng)建一個 Result 構(gòu)建器积瞒,該構(gòu)建器了解如何使用所需的任何轉(zhuǎn)換將多個字符串轉(zhuǎn)換為一個字符串,如下所示:

@resultBuilder  //@resultBuilder屬性告訴 SwiftUI 以下類型應(yīng)視為結(jié)果生成器登下。
struct SimpleStringBuilder {
//每個結(jié)果生成器必須提供至少一個稱為 buildBlock() 的靜態(tài)方法茫孔,該方法應(yīng)獲取某種數(shù)據(jù)并將其轉(zhuǎn)換叮喳。
//示例接收零個或多個字符串,將它們連接起來缰贝,然后將它們作為單個字符串發(fā)送回去馍悟。
    static func buildBlock(_ parts: String...) -> String {
        parts.joined(separator: "\n")
    }
}

最終結(jié)果是我們的 SimpleStringBuilder 結(jié)構(gòu)成為結(jié)果生成器,這意味著我們可以在需要其字符串連接能力的任何地方使用 @SimpleStringBuilder剩晴。

我們可以像下面這樣直接使用 SimpleStringBuilder.buildBlock():

let joined = SimpleStringBuilder.buildBlock(
    "Why settle for a Duke",
    "when you can have",
    "a Prince?"
)

print(joined)

但是锣咒,因為我們在 SimpleStringBuilder 結(jié)構(gòu)中使用了 @resultBuilder 批注,所以我們也可以將其應(yīng)用于函數(shù)赞弥,如下所示:

@SimpleStringBuilder func makeSentence3() -> String {
    "Why settle for a Duke"
    "when you can have"
    "a Prince?"
}

print(makeSentence3())

如果您想查看實際的結(jié)果生成器示例毅整,請查看 GitHub 上的 Awesome Function Builders 存儲庫(https://github.com/carson-katri/awesome-function-builders)。

現(xiàn)在支持局部變量的屬性包裝器

屬性包裝器最初是在 Swift 5.1 中引入的绽左,它是一種通過簡單悼嫉,可重復(fù)使用的方式將附加功能附加到屬性的方法,但是在 Swift 5.4 中拼窥,它們的行為得到擴(kuò)展以支持將其用作函數(shù)中的局部變量戏蔑。

例如,我們可以創(chuàng)建一個屬性包裝器鲁纠,以確保其值永遠(yuǎn)不會低于零:

@propertyWrapper struct NonNegative<T: Numeric & Comparable> {
    var value: T

    var wrappedValue: T {
        get { value }

        set {
            if newValue < 0 {
                value = 0
            } else {
                value = newValue
            }
        }
    }

    init(wrappedValue: T) {
        if wrappedValue < 0 {
            self.value = 0
        } else {
            self.value = wrappedValue
        }
    }
}

從 Swift 5.4 起辛臊,我們可以在常規(guī)函數(shù)中使用該屬性包裝器,而不僅僅是將其附加到屬性上房交。例如彻舰,我們可能編寫了一款游戲,玩家可以得或失候味,但得分不得低于0:

func playGame() {
    @NonNegative var score = 0

    // player was correct
    score += 4

    // player was correct again
    score += 8

    // player got one wrong
    score -= 15

    // player got another one wrong
    score -= 16

    print(score)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刃唤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子白群,更是在濱河造成了極大的恐慌尚胞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帜慢,死亡現(xiàn)場離奇詭異笼裳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粱玲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門躬柬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抽减,你說我怎么就攤上這事允青。” “怎么了卵沉?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵颠锉,是天一觀的道長法牲。 經(jīng)常有香客問我,道長琼掠,這世上最難降的妖魔是什么拒垃? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮瓷蛙,結(jié)果婚禮上悼瓮,老公的妹妹穿的比我還像新娘。我一直安慰自己速挑,他們只是感情好谤牡,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布副硅。 她就那樣靜靜地躺著姥宝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恐疲。 梳的紋絲不亂的頭發(fā)上腊满,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音培己,去河邊找鬼碳蛋。 笑死,一個胖子當(dāng)著我的面吹牛省咨,可吹牛的內(nèi)容都是我干的肃弟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼零蓉,長吁一口氣:“原來是場噩夢啊……” “哼笤受!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敌蜂,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箩兽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后章喉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汗贫,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年秸脱,在試婚紗的時候發(fā)現(xiàn)自己被綠了落包。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡摊唇,死狀恐怖妥色,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遏片,我是刑警寧澤嘹害,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布撮竿,位于F島的核電站,受9級特大地震影響笔呀,放射性物質(zhì)發(fā)生泄漏幢踏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一许师、第九天 我趴在偏房一處隱蔽的房頂上張望房蝉。 院中可真熱鬧,春花似錦微渠、人聲如沸搭幻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檀蹋。三九已至,卻和暖如春云芦,著一層夾襖步出監(jiān)牢的瞬間俯逾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工舅逸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留桌肴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓琉历,卻偏偏與公主長得像坠七,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旗笔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

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

  • 概覽 Swift 5 發(fā)布了彪置,這是一個重要里程碑。 此版本終于迎來了 ABI 穩(wěn)定换团,因此 Swift 運行時現(xiàn)在可...
    _森宇_閱讀 3,592評論 0 7
  • 翻譯自:What's New in Swift 5.1? Getting Started Swift 5.1 與 ...
    plantseeds閱讀 1,160評論 0 0
  • Print 函數(shù)傳參新格式 允許在模塊中定義和標(biāo)準(zhǔn)庫中名稱一樣的類型比如在MyModule模塊中定義Result ...
    HarveyCC閱讀 1,341評論 0 0
  • 在Xcode10.2終于可以用上Swift5了悉稠,這次發(fā)布帶來了ABI(應(yīng)用程序機(jī)器二元碼界面(英語:applica...
    純情_小火雞閱讀 2,709評論 0 4
  • JDK各個版本的新特性 對于很多剛接觸java語言的學(xué)者來說,要了解一門語言艘包,最好的方式是從基礎(chǔ)的版本進(jìn)行理解的猛,升...
    小莊bb閱讀 1,102評論 0 1