SwiftUI iOS精品开源项目之 03 仿机械齿轮英式时钟语音播报支持widget 小组件(教程含源码)

实战需求

SwiftUI iOS精品开源项目之 03 仿机械齿轮英式时钟语音播报支持widget

本文价值与收获

看完本文后,您将能够作出下面的界面

仿机械齿轮英式时钟

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

发表回复