改進(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)
}