阅读视图
远离 dismiss,拥抱状态驱动
在 SwiftUI 开发中,环境值 dismiss 因其灵活、自适应的特性备受开发者青睐。它能够根据当前视图的上下文智能执行关闭操作:在模态视图中关闭窗口、在导航堆栈中弹出视图,甚至在多列导航容器中自动关闭边栏。正是这种看似“万能”的便捷性,让许多开发者将它作为首选工具。然而,便捷的背后往往隐藏着风险。频繁使用 dismiss 可能在应用程序中埋下隐患,引发测试难题乃至难以追踪的稳定性问题。本文将分析我们为何应谨慎对待 dismiss,并介绍更加健壮可靠的状态管理方案。通过重新审视视图呈现与消失的逻辑,我们能够打造出更稳定、易维护且可预测的 SwiftUI 应用。
MCP 崛起与苹果的 AI 框架设想 | 肘子的 Swift 周报 #077
MCP 崛起与苹果的 AI 框架设想 - 肘子的 Swift 周报 #77
在最近一段时间,在社交网络上,越来越多的 Model Context Protocol(MCP)使用者展示了各种丰富多彩的应用场景,从操控 Blender 创建精美场景,到利用最新的 GPT-4o 图片构建完整的漫画故事。MCP 巧妙地打开了以文本为主要互动手段的大模型,与现实世界之间的大门。
SwiftUI-国际化
介绍
- 如果 App 需要提供给不同国家的用户使用,则需要进行国际化处理。
- SwiftUI 项目的国际化主要包括:Info.plist 文件国际化、文本国际化等。
配置国际化语言
在进行国际化之前,必须要添加需要的国际化语言,选中国际化的项目 —> PROJECT —> Info —> Localizations,点击+
添加需要的国际化语言(默认已经存在英文)。
Info.plist文件国际化
- 新建一个
Strings File
,必须命名为InfoPlist.strings
。 - 选中
InfoPlist.strings
,在 Xcode 的右侧文件检查器中找到Localization
,点击Localize...
,然后勾选配置的国际化语言。 -
InfoPlist.strings
左侧多了一个箭头,点击箭头展开后可以看见不同语言的Strings File
,里面存放的是形如Key = Value
的键值对。 - 在不同语言的
Strings File
中设置需要国际化的内容,如 App 名称等。
// 英文App名
"CFBundleName" = "I18N";
// 中文App名
"CFBundleName" = "国际化";
文本国际化
- 新建一个
Strings File
,必须命名为Localizable.strings
。 - 选中
InfoPlist.strings
,在 Xcode 的右侧文件检查器中找到Localization
,点击Localize...
,然后勾选配置的国际化语言。 -
Localizable.strings
左侧多了一个箭头,点击箭头展开后可以看见不同语言的Strings File
。 - 在不同语言的
Strings File
中设置需要国际化的文本键值对。
// 英文
"title" = "Reminder";
"message" = "Weather Information";
// 插值
"Weather is %@" = "Today is %@";
"Temperature is %lld" = "The temperature is %lld";
// 中文
"title" = "提示";
"message" = "今日天气";
// 插值
"Weather is %@" = "今天 %@";
"Temperature is %lld" = "气温 %lld 度";
- SwiftUI 文本国际化非常简单,开箱即用,因为大多数 View 与 Modifier 的构造方法中都将
LocalizedStringKey
作为参数类型,该参数的值为文本键值对中的键。
import SwiftUI
struct ContentView: View {
let weather = "Sunny"
let temperature = 10
var body: some View {
VStack {
// 纯文本,有3种方式
Text(title)
Text(LocalizedStringKey("title"))
Text("title", comment: "The title of the dialog.")
// 自定义View
MessageView("message")
// 插值
Text("Weather is \(weather)")
Text("Temperature is \(temperature)")
}
}
}
struct MessageView: View {
var messaege: LocalizedStringKey
init(_ messaege: LocalizedStringKey) {
self.messaege = messaege
}
var body: some View {
Text(messaege)
}
}
注意:插值格式参考 String Format Specifiers。
测试
默认情况下,App 的语言随着系统语言的变化而变化。但在开发阶段,如果才能快速测试 App 的国际化效果?主要有以下几种方式。
- 运行 App 之后在设备/模拟器通过设置(Settings)—> 通用(General)—> 语言与地区(Languages & Region) 切换系统语言以查看 App 的国际化效果。
- 通过 Xcode 菜单 —> Product —> Scheme —> Edit Scheme... —> Run —> Options —> App Language,选择需要测试的国际化语言之后再运行 App。
- 通过 Xcode 菜单 —> Product —> Scheme —> Manage Scheme... —> 选择需要复制的 Scheme —> 点击下方的圆形...图标 —> Duplicate —> 重命名 Scheme,然后将复制的 Scheme 按照方式 2 将 App Language 设置为需要测试国际化语言,最后运行时选择对应国际化语言的 Scheme。
效果
- 英文。
- 中文。
SwiftUI Environment:理念与实践
SwiftUI 的 Environment 是一个优雅且功能强大的依赖注入机制,几乎每个 SwiftUI 开发者都会在日常开发中接触和应用。这一机制不仅简化了视图间的数据传递,也为应用架构设计提供了更多的可能性。本文将暂且搁置具体的实现细节,转而聚焦于 Environment 在架构中的角色与边界,探讨那些常被忽视却至关重要的设计理念与实践经验。