实战需求
SwiftUI iOS精品开源项目之 03 仿机械齿轮英式时钟语音播报支持widget
本文价值与收获
看完本文后,您将能够作出下面的界面
看完本文您将掌握的技能
- 🐰时间用英式英语书写,例如07:20的上午7点20分
- ⏰尼斯时钟为您提供选定的时间
- 您可以移动时钟臂来设置时间
- 🕰定制时钟的设计(经典,新艺术风格或绘画风格)
- ⏱为了方便您显示分钟/小时指示器或限时
- 🗣可以听到英国口音的时间
- can您可以减慢配置中的语音(语音速率)
- can您可以激活语音识别来训练您的发音。
- 👾今日小工具为您提供当前时间
核心开源组件
Combine Schedulers
一些调度程序使 Combine的工作更具可测试性和更多功能
Combine框架提供了“ Scheduler”协议,该协议是用于描述工作单元的执行方式和时间的强大抽象。它统一了许多不同的执行工作方式,例如DispatchQueue,RunLoop和OperationQueue。
但是,当您在响应式代码中使用这些调度程序中的任何一个时,立即使发布者变得异步,因此变得更加难以测试,从而迫使您使用期望值并等待发布者执行时花费时间。
该库提供了新的调度程序,使您可以将任何异步发布者转变为同步发布者,以便于测试和调试。
RenaudJennyAboutView
强大的SwiftUI库,提供了我在所有应用程序中使用的“关于”视图
- 可以更改显示的图片
- 可以更改AppId以直接在AppStore上对应用程序进行评分
SnapshotTesting
令人愉快的Swift快照测试。
swift-case-paths
case path为枚举带来了关键路径的强大功能
Swift为每个struct和class属性赋予了关键路径。
struct User {
var id: Int
var name: String
}
\User.id // WritableKeyPath<User, Int>
\User.name // WritableKeyPath<User, String>
swift-composable-architecture
此库提供了一些核心工具,可用于构建不同用途和复杂性的应用程序。它提供了引人入胜的故事,您可以关注这些故事来解决您在构建应用程序时遇到的许多问题:
- State management
如何使用简单的值类型管理应用程序的状态,并在多个屏幕上共享状态,以便在另一个屏幕中立即观察到一个屏幕上的突变 - Composition
何将大功能分解成较小的组件,这些组件可以提取到自己的孤立模块中,并轻松粘合在一起以形成该功能。 - Side effects
如何让应用程序的某些部分以最可测试、最易理解的方式与外界对话。 - Testing
不仅要测试架构中内置的功能,还要编写由多个部分组成的功能的集成测试,并编写端到端测试,以了解副作用如何影响您的应用。这允许您做出强有力的保证,确保您的业务逻辑以您期望的方式运行。 - Ergonomics
如何在一个简单的API中完成上述所有内容,并尽可能少的概念和移动部件。
SwiftClockUI
Clock UI for SwiftUI
struct ContentView: View {
@State private var date = Date()
var body: some View {
ClockView().environment(\.clockDate, $date)
}
}
SwiftPastTen
特定时间格式 (Hh:mm) 适用英国
SwiftRegex5
正则表达式库
SwiftSpeechCombine
一个非常简单的组合包装围绕SFSpeech识别器的语音识别部分,让您轻松使用
SwiftToTen
识别英国英语时间,并尝试将其转换为"Date"
SwiftTTSCombine
一个非常简单的组合包装围绕 TTS 部分的 AV 基础/AVSpeech 合成器,让您轻松使用文本到语音。
核心代码库
- APP目前组织,设置一个AppCore.swift 存放app内核心数据
struct AppState: Equatable {
var date: Date = Date()
var configuration = ConfigurationState()
var tts = TTSState()
var speechRecognition = SpeechRecognitionState()
var isAboutPresented = false
var tellTime: String?
}
enum AppAction: Equatable {
case setDate(Date)
case setRandomDate
case configuration(ConfigurationAction)
case tts(TTSAction)
case speechRecognition(SpeechRecognitionAction)
case appStarted
case presentAbout
case hideAbout
}
struct AppEnvironment {
var currentDate: () -> Date
var randomDate: (Calendar) -> Date
var ttsEngine: TTSEngine
var calendar: Calendar
var tellTime: (Date, Calendar) -> String
var speechRecognitionEngine: SpeechRecognitionEngine
var recognizeTime: (String, Calendar) -> Date?
var mainQueue: AnySchedulerOf<DispatchQueue>
}
-
onOpenURL当视图接收到视图所处的场景或窗口的网址时,注册处理程序以调用。
WindowGroup { MainView(store: store) .onOpenURL(perform: { openURL($0, viewStore: viewStore) }) }
-
业务流程,日期类,随机生成日期
import SwiftUI
func generateRandomDate(calendar: Calendar) -> Date {
let hour = [Int](1...12).randomElement() ?? 0
let minute = [Int](0...59).randomElement() ?? 0
return calendar.date(bySettingHour: hour, minute: minute, second: 0, of: .epoch) ?? .epoch
}
private extension Date {
static var epoch: Date { .init(timeIntervalSince1970: 0) }
}
全文地址
CSDN:
小专栏:
加入我们一起学习SwiftUI
QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com