SwiftUI 表达式

www.youtube.com/shorts/EDd6...

"^[\(count)Person](inflect: true)"

代码

Swift 复制代码
struct ContentView: View {
    
    @State private var count = 1
    
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
            
            Spacer()
            
            Button("Add") { count += 1}
            Button("Remove") { count -= 1}
            Text("^[\(count)People](inflect: true)").padding()
            Text("^[\(count)Dog](inflect: true)").padding()
            Text("^[\(count)Hobby](inflect: true)").padding()
        }
        .padding()
    }
} 
Swift 复制代码
"^[\(count)People](inflect: true)"

或者

Swift 复制代码
"^[\(count)Person](inflect: true)"

输出

Swift 复制代码
0People  1Person 2People...

Q: ^[\(count)People](inflect: true) 这是个表达式吗?

Deepseek: 是的,^[\(count)People](inflect: true) 是一个表达式,通常出现在某些模板引擎或文本处理系统中(比如 Sugarcube、Twine 或其他类似工具)。它的作用可能是:

  1. 动态显示数量+名词

    • \(count) 是一个变量插值,会被替换为 count 变量的值(比如 5)。
    • People 是默认文本,但会根据 count 的值自动调整单复数形式(由 inflect: true 控制)。
  2. 功能解析

    • ^[...] 可能是特殊语法,表示动态内容或宏。
    • inflect: true 启用语法变形(如英语中 1 person vs 5 people)。
  3. 示例结果

    • count = 1 → 输出 1 Person
    • count = 3 → 输出 3 People

具体行为取决于你使用的工具文档,但整体是一个动态文本生成表达式

但是有个问题,一直减会出现负数

Q: 这个限制一下 不能出现负数

Deepseek:

使用 max 确保 count ≥ 0

Text 显示时强制 count 最小为 0(但实际变量值仍为负数):

Swift 复制代码
Text("^[\(max(count, 0)) People](inflect: true)")  // 显示时限制最小值

询问更多表达式

在 SwiftUI 中,除了 ^[\(count) People](inflect: true) 这种基础的本地化复数/语法变形 表达式外,Apple 还提供了更多强大的本地化字符串插值格式化表达式。以下是几种进阶用法:


1. 自动复数变形(Inflection)

适用于不同数量的名词变形(英语等语言):

swift 复制代码
Text("^[\(count) Person](inflect: true)")  
// 自动输出: "1 Person" / "2 People" / "0 People"

2. 单位格式化(Measurement)

自动处理单位转换本地化格式(如温度、距离):

swift 复制代码
let speed = Measurement(value: 100, unit: UnitSpeed.kilometersPerHour)
Text(speed, format: .measurement(width: .abbreviated)) 
// 输出: "62 mph"(根据系统语言/地区自动转换)

3. 数字/日期格式化

数字格式化(货币、百分比等):

swift 复制代码
Text(1234.56, format: .currency(code: "USD")) // "$1,234.56"
Text(0.75, format: .percent))                 // "75%"

日期格式化

swift 复制代码
Text(Date.now, format: .dateTime.year().month().day())) // "Jul 28, 2023"

4. 条件化字符串(Conditional)

根据条件显示不同文本:

swift 复制代码
Text("You have \(count) \(count == 1 ? "item" : "items")")
// 或使用 Swift 5 的字符串插值:
Text("You have \(count) \("item", count: count)")

5. 高级本地化(LocalizedStringKey)

直接使用本地化键值:

swift 复制代码
Text("welcome_message") // 自动匹配 Localizable.strings 中的键

带参数的本地化:

swift 复制代码
Text("cart_items_count \(count)") 
// Localizable.strings 中定义:
// "cart_items_count %lld" = "You have %lld items in cart";

6. 动态样式(Markdown/Inline Styling)

支持 Markdown 和动态样式:

swift 复制代码
Text("**Hello** *World*! [Learn More](https://apple.com)") 
// 粗体、斜体、可点击链接

7. 安全处理负数(你的需求)

如果坚持用 inflect 但要避免负数:

swift 复制代码
Text("^[\(max(count, 0)) Person](inflect: true)") // 强制最小为 0

总结

场景 表达式示例
复数变形 ^[\(count) Book](inflect: true)
单位格式化 Text(speed, format: .measurement(width: .narrow))
数字格式化 Text(9.99, format: .currency(code: "EUR"))
条件文本 Text("\(count) file\(count == 1 ? "" : "s")")
本地化键 Text("greeting")
Markdown Text("Press **Next** to continue")

根据需求选择最适合的表达式,多数情况下 inflect: true + 数值限制 已足够处理你的案例。

2. 单位格式化(Measurement) 🔍 swiftui measurement

Working with Units and Measurements in SwiftUI - Cocoacasts

Measurement | Apple Developer Documentation

Units and Measurement | Apple Developer Documentation

Swift Measurement API

视频上有Automatic Grammar Agreement 遂🔍

InflectionRule | Apple Developer Documentation

How to use Automatic Grammar Agreement in Swift

Automatic grammar agreement - Forums > SwiftUI

这个里面有code,视频链接就是最上面的链接

突然发现0个人竟然是0People

Q: 0个人是 0 person 还是 0 people

在英语中,数字 "0" 后面的可数名词通常用复数形式,即使数量为零。这是因为复数形式更符合语法习惯,表示"零个"的概念。

永远用复数:0 + 可数名词复数(0 apples, 0 people)

在英语中,"0" 后面的名词通常使用复数形式,因此正确的表达是:

0 people

原因:

  1. 语法习惯:在英语中,数字 "0" 之后的计数名词通常用复数形式(即使数量为零)。类似的例子包括:

    • 0 apples(不是 0 apple)
    • 0 cars(不是 0 car)
  2. 逻辑意义:虽然 "0" 表示没有,但复数形式 "people" 更符合英语中数量描述的习惯,强调"零个个体"而非单数概念。

例外情况:

  • 如果 "person" 作为不可数名词(泛指"人"这一概念),可能会用单数,但这种情况极少见且不自然。例如:
    • "There is 0 person in the room."(听起来不自然)
    • 更自然的表达"There are 0 people in the room."

结论:

正确用法0 people (绝大多数情况下)

不自然:0 person

希望这个解释对你有帮助! 😊

在英语中,数字 "0" 后面的可数名词通常用复数形式,即使数量为零。这是因为复数形式更符合语法习惯,表示"零个"的概念。

更多例子:

正确(复数) 错误(单数)
0 books ❌ 0 book
0 dogs ❌ 0 dog
0 computers ❌ 0 computer
0 students ❌ 0 student
0 chairs ❌ 0 chair
0 phones ❌ 0 phone
0 trees ❌ 0 tree
0 cups ❌ 0 cup
0 ideas ❌ 0 idea
0 problems ❌ 0 problem

为什么用复数?

  1. 语法规则 :英语中,任何非 "1" 的数量(包括 0),后面的可数名词都用复数形式。

    • 1 apple(单数)
    • 0 apples / 2 apples / 100 apples(复数)
  2. 逻辑一致性:即使数量为零,仍然表示"多个事物不存在",因此用复数更自然。

例外情况(极少见)

  • 如果名词本身是不可数名词 (如 "water"、"information"),则保持不变:
    • 0 water(不是 "0 waters")
    • 0 money(不是 "0 monies",除非指不同种类的货币)

总结

永远用复数 :0 + 可数名词复数(0 apples, 0 people)

避免单数:0 apple, 0 person(不自然)

希望这些例子能帮你掌握这个规则! 😊

person(dictionary.cambridge)

相关推荐
I烟雨云渊T6 小时前
iOS实名认证模块的具体实现过程(swift)
ios·cocoa·swift
Swift社区1 天前
LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)
算法·leetcode·swift
I烟雨云渊T1 天前
iOS瀑布流布局的实现(swift)
开发语言·ios·swift
Pythonliu73 天前
启智平台调试 qwen3 4b ms-swift
开发语言·swift
画个大饼3 天前
iOS启动优化:从原理到实践
macos·ios·objective-c·swift·启动优化
画个大饼12 天前
Swift中Class和Struct的深度对比分析
开发语言·ios·swift
桃花仙丶13 天前
iOS/Flutter混合开发之PlatformView配置与使用
flutter·ios·xcode·swift·dart
一牛13 天前
译:Swift中的隔离机制介绍
macos·ios·swift
hepherd13 天前
iOS - 音频: Core Audio - 播放
swift·音视频开发
画个大饼13 天前
深度对比:Objective-C与Swift的RunTime机制与底层原理
开发语言·objective-c·swift