首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

架构之路 (七) —— iOS App的SOLID原则(一)

接下来,打开 ContentView.swift。 这是应用程序中的第一个视图,您可以在其中选择要显示的费用报告类型:每日或每月。 假设您想添加本周的报告。...Updating ContentView.swift 此时,您在 ContentView.swift 中只剩下几个错误。 转到该文件并开始修复它们。...打开 ReportRange.swift 并在每天和每月之间的枚举中添加一个新的每周值: case weekly = "This Week" 在 timeRange()中,添加为此值返回的日期: case...这是一个相当复杂的努力,只是为了显示一些属性。 现在,视图依赖于一个抽象协议,您可以使用 Core Data 模型或简单的旧结构来实现它。...相反,SOLID 为您提供了一些指导方针,帮助您以更有条理的方式编写代码。 它使修复bug更安全,因为您的对象不会纠缠在一起。编写单元测试更容易。即使将您的代码从一个项目重用到另一个项目也毫不费力。

4.7K10

窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

说到协议,在Objective-C中也是有协议的,并且Swift中的协议和Objc中的协议使用起来也是大同小异的,在Java等现代面向对象编程语言中有接口(Interface)的概念,其实和Swift中或者...上面使用的委托回调主要是使用Swift中的协议(Protocol)来实现的。那么如何使用协议来实现你自己的委托回调呢?这将是下面将要介绍的内容。   二....上面实例的意思就是把下一个页面的值通过委托代理回调的形式传到上个页面中去,在前面的博客《窥探Swift之函数与闭包的应用实例》中也做了同样的事情,不过之前我们是使用闭包(Closure)回调来实现的。...紧接着我们要实现一个协议,这个协议我们用来所委托回调使用。这个协议可以定义在EditViewController.swift源文件中。在协议定义之前,先对什么是协议简单的提上一嘴。...(1)首先要解决的就是点击Cell跳转到EditViewController, 要执行这个事件,我们还必须实现TableView的另一个协议,就是UITableViewDelegate, 以为点击Cell

3.6K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

    下载好材料打开 TravelVlogs.xcodeproj 并转到 VideoFeedView.swift。 注意:视频可能无法在模拟器中播放。 在真实设备上运行该应用程序将缓解该问题。...将播放器视为能够一次管理一个媒体资产的播放的控制器对象。 3) VideoPlayer 是一个方便的 SwiftUI 视图,需要播放器对象才能发挥作用。 您可以使用它来播放视频。...转到 Video.swift。 在这里您可以看到 fetchRemoteVideos()只是加载另一个 JSON 文件。...转到 LoopingPlayerView.swift,您将在其中找到一个用于显示视频的空视图。 它需要一组视频 URL 才能播放。...每次收到通知时,您都会知道播放器已进入下一个视频。 要在 Swift 中使用 KVO——比在 Objective-C 中好得多——你需要保留对观察者的引用。

    7K10

    添加多个屏幕-创建格线布局

    在上一节中,我们学习了如何使用按钮更改iPhone的屏幕。让我们进一步推动!我们将实现一个CollectionView,我们将能够切换到您想要的壁纸。该的CollectionView将是滚动的水平。...改变cell的颜色白,因为集合视图也是白色的。 ? MultipleScreens05 屏幕视图 然后,从对象库中,将Button拖放到cell内。...DialogViewController协议 我们需要设置另一个协议,以便能够通过segue 将委托发送给View Controller。...使用segue的名称声明一个if语句。这样,您确定在调用此segue时,我们将执行操作。将委托设置为self。我们需要使用委托来指定我们正在调用,否则,View Controller不知道。...在 Cell 文件中,为索引声明一个变量并使其为0.然后,在screenImageButtonTapped的值内,调用索引及其类型Int。因此,它上面的代理将具有相同的值,它将返回一个索引。

    2.9K40

    Swift 6 的时代来临了!苹果:它是超越 C++ 的最佳选择

    另一个推动跨平台 Swift 的因素是 The Browser Company。该公司基于 Chromium 的 Arc 浏览器有些部分就是在 Windows 上使用 Swift 构建的。...也就是说可以将一个范围插入另一个范围并合并所有重合范围,而非创建重复项。...函数将资金从一个账户发往另一账户: public func sendMoney(from: Int, to: Int) -> BankTransaction { // 处理资金发送操作...但由于泛型类参数会自动符合 Copyable,所以我们必须使用~Copyable 明确选择退出。 同样的,此项变更意味着不可复制类型现在也可以符合协议,但前提是将这些协议也标记为~Copyable。...(顺带一提,Copyable 类型也可以良好符合不可复制协议。) SE-0429 通过添加对不可复制值的部分使用,进一步完善了这种情况。

    28210

    掌握 SwiftUI 的 task 修饰器

    随着 Swift 5.5 引入了 async/await 特性,苹果也为 SwiftUI 添加了 task 视图修饰器,以方便开发者在视图中使用基于 async/await 的异步代码。....task(priority: .background) { // do something } 任务优先级并不会影响创建任务所使用的线程 task vs onChange 另一个版本的 task...“出现之前”执行一次异步任务外,还会在其观察的值( 符合 Equatable 协议 )发生变化时,重新执行一次任务( 创建一个新的异步任务 ): struct TaskDemo2: View {...回到当前的问题,由于 View 协议限定了 body 属性必须运行于主线程中( 使用了 @MainActor 进行标注 ),因此,如果我们直接在 body 中为 task 修饰器添加闭包代码,那么该闭包只能运行于主线程中...使用 task 替换 onReceive 可以获得两个好处: 减少视图不必要的刷新( 避免重复计算 ) 在后台线程响应消息,减少主线程的负荷 为老版本的 SwiftUI 添加 task 修饰器 当前,Swift

    3.6K60

    WWV 2018年十大必看视频

    利用泛型类型可以使Swift使用参数多态 - 这是泛型的另一个名称。 设计协议是检查泛型是Swift的好方法。该演讲涵盖了如何使用泛型类型统一具体类型。...另一个高级技巧涉及执行线程 - 谨慎,因为您可以更改应用程序的状态。p是另一个LLDB命令,用于查看当前对象的调试表示。在暂停时使用“变量调试器”,可以查看和过滤属性以查找要检查的项目。...- Apple Miles软件工程经理Chris Miles 在会议期间,还会调试macOS应用程序的视图 - 这次,检查View Debugger中的元素 - 使用相同的技巧来打印视图和约束的值。...您可以将脚本放入正文或创建对项目中另一个脚本的引用。例如,如果将脚本放入外部文件中,则在Xcode 10“文件列表”中,它是只读的,不会被编译。您的输出文件也可以放在文件列表中。...在您的代码中,尝试减少复杂的表达式。在某些情况下,将代码移动到协议,以便编译器不必搜索整个文件。 减少混合源应用程序之间的接口。使用@private关键字排除Swift生成的标头中的项目。

    2.8K20

    苹果将为 Apple Watch X 铺路 | Swift 周报 issue 45

    讨论 Swift 中循环表达式的可能性,类似于 Rust 或 Haskell 等函数式语言,其中循环可以“生成”一个值,帮助编译器进行必要的检查。...T { return v } else { return nil } } 5) 讨论覆盖默认协议实现 我最近试图为协议 Foo 设置一个默认实现,它可以根据对象是否也符合另一个协议 Bar 为其属性...MongoDB 还创建了另一个数据库驱动程序,该驱动程序提供了包装其内部 C 实现的 Swift API。 然而,该驱动程序是生态系统中的一个相对较新的成员,自此已停产。...文章首先,使用 SwiftUI 的 Grid 容器视图展示游戏状态并在游戏变化时进行动画处理;其次,实现根据游戏的四个规则从一代到下一代改变细胞状态的逻辑。...文章还介绍了使用 SwiftUI 创建康威生命游戏的不同视图,包括使用 Grid 和 Canvas 的不同布局方式。

    15132

    WWDC 2018年十大视频评论

    的首席iOS工程师 如今,机器学习仍然是一个热门话题,Apple已经很容易将这项技术添加到您的应用程序中。使用Core ML 2,您可以将机器学习视为从代码中调用库。...利用泛型类型可以使Swift使用参数多态 - 这是泛型的另一个名称。 设计协议是检查泛型是Swift的好方法。该演讲涵盖了如何使用泛型类型统一具体类型。...- Apple Miles软件工程经理Chris Miles 在会话期间,还会调试macOS应用程序的视图 - 这次,检查View Debugger中的元素 - 使用相同的技巧来打印视图和约束的值。...您可以将脚本放入正文或创建对项目中另一个脚本的引用。例如,如果将脚本放入外部文件中,则在Xcode 10“文件列表”中,它是只读的,不会被编译。您的输出文件也可以放在文件列表中。...在您的代码中,尝试减少复杂的表达式。在某些情况下,将代码移动到协议,以便编译器不必搜索整个文件。 减少混合源应用程序之间的接口。使用@private关键字排除Swift生成的标头中的项目。

    3.4K20

    VSCode1.59版本发布

    选择一个类别将在“扩展”视图中显示该类别中的其他扩展。 这个是一个新的设置功能 ---- 阵列设置现在在非编辑模式下具有拖放支持。...可用的分隔符选项有: auto (默认)- 使用操作系统特定的路径分隔符。 / - 使用斜杠作为路径分隔符。 \\ - 使用反斜杠作为路径分隔符。...又是一个新的设置 workbench.editor.sharedViewState添加了一个新设置来配置编辑器视图状态(例如,编辑器中的滚动位置)在编辑器组之间共享的方式。...在折叠区域之间导航,需要自己绑定 有一些新命令可以将光标位置设置为相应的折叠: 转到下一个折叠( editor.gotoNextFold) 转到上一个折叠( editor.gotoPreviousFold...终端拖放 将终端从一个窗口的选项卡列表或编辑器区域拖放到另一个窗口的选项卡列表、编辑器区域或面板中。

    1.7K30

    掌握 SwiftUI 的 task 修饰器

    task(priority: .background) { // do something}任务优先级并不会影响创建任务所使用的线程task vs onChange另一个版本的 task 修饰器则提供了类似...“出现之前”执行一次异步任务外,还会在其观察的值( 符合 Equatable 协议 )发生变化时,重新执行一次任务( 创建一个新的异步任务 ):struct TaskDemo2: View { @...使用 url.lines 和 url.resourceBytes 获取网络数据时,系统 API 会跳转到后台线程,不过最终仍会回到主线程上想要了解并解决这个问题,我们还要从 task 修饰器的定义中入手...回到当前的问题,由于 View 协议限定了 body 属性必须运行于主线程中( 使用了 @MainActor 进行标注 ),因此,如果我们直接在 body 中为 task 修饰器添加闭包代码,那么该闭包只能运行于主线程中...使用 task 替换 onReceive 可以获得两个好处:减少视图不必要的刷新( 避免重复计算 )在后台线程响应消息,减少主线程的负荷为老版本的 SwiftUI 添加 task 修饰器当前,Swift

    2.2K30

    ARKit 的配置-在您的AR项目的幕后

    在本节中,我们将看看如何在后面配置提供的ARKit模板。我们将发现什么是世界跟踪和AR会话。同样,我们将学习如何将一些调试选项应用于场景中的指导。...转到ViewController.swift文件。这是所有代码都是针对我们之前在Main.storyboard中看到的视图控制器场景编写的。 导入套件 套件是Apple提供的框架,它们与特定主题相关。...查看控制器类 在导入下方,ViewController已被声明为UIViewController类的一部分,并且与故事板中的视图相关。类具有属性,方法和协议,所有这些都在开发中被利用。...会话使用其会话实例控制所有处理,并由场景视图自动创建。当您开始体验时,会话开始。 你能告诉我另一个用于ARKit的流行技术的例子吗?让我给你一个提示:Animoji。...WatchSceneComparison 结论 虽然可以从一开始就使用模板,但了解它的结构非常重要。一些开发人员更喜欢从头开始,因为它有时不适合他们的需求。现在,你也可以自己开始。

    2.5K20

    将模型添加到场景中 - 在您的环境中显示3D内容

    在本教程中,我们将学习如何检索模型并使用按钮的触发器将其呈现在场景中。一旦显示,我们将隐藏焦点方块。...添加按钮 我们想在视图中添加一个按钮,用作在场景中添加模型的触发器。从对象库中,将UIButton拖动到场景视图的顶部。在“ 属性”检查器中,删除“ 按钮”标题并将图像设置为“ 按钮/添加”。...在ViewController.swift中,将一个新的类变量声明为一个节点数组,我们将其初始化为空。...在FocusSquare类中,让我们创建一个函数来为焦点方块的表示设置动画。将隐藏和显示两种情况,因此隐藏值是布尔值。然后我们声明一个SCNAction用于淡入淡出,淡出用于隐藏和淡入显示。...请记住,如果显示模型,我们将隐藏焦点方块,反之亦然。如果这两个因子的值不相等,我们将改变焦点平方的isHidden值。

    5.5K20

    深度解读 Observation —— SwiftUI 性能提升的新途径

    在 WWDC 2023 中,苹果介绍了 Swift 标准库中的新成员:Observation 框架。它的出现有望缓解开发者长期面临的 SwiftUI 视图无效更新问题。...如何在视图中使用可观察对象 在视图中声明可观察对象 与遵守 ObservableObject 协议的 Source of Truth 不同,我们会在视图中使用 @State 来确保可观察对象的声明周期。...观察行为是线程安全的,withObservationTracking 可以运行在另一个线程中,onChange 闭包将运行于 withObservationTracking 发起的线程中 只有可观察属性可以被观察...)发生变化,便对 body 重新评估 可观察对象支持嵌套吗( 一个可观察对象的属性为另一个可观察对象 ) 支持。...另外, 我们之前在视图中很多的优化技巧也将发生改变。例如,在使用 ObservableObject 时,我们会通过只引入与当前视图有用的数据,来减少不必要的刷新。

    61920

    在Swift中使用工厂进行依赖注入

    这还不算太糟,因为我们只有一个依赖关系。然而,我们的列表视图很可能不是只有一层,这在某种程度上需要我们实现导航到另一个视图控制器。...一个选择是简单地将发送者也添加到列表视图控制器的初始化器中: class MessageListViewController: UITableViewController { init(loader...= factory.makeMessageViewController(for: message) 就像我们在 "使用工厂模式来避免Swift中的共享状态 "中看到的那样,我非常喜欢工厂的一点是,它可以让你完全解耦对象的使用和创建...我们将首先为我们的工厂定义一个协议,这将使我们能够轻松地创建我们应用程序中需要的任何视图控制器,而不需要实际了解其依赖性或初始化器。...由于我们已经将所有的工厂定义为协议,我们可以通过实现任何给定工厂协议的特定测试版本,在测试中轻松地模拟它们。我将在未来的博文中写更多关于模拟和如何在测试中充分利用依赖注入的内容。 你怎么看?

    83320

    应用程序内购买教程:入门

    您将看到一个空表视图,导航栏中有一个“恢复”按钮,稍后将连接该按钮以恢复购买。 ? image 完成本教程后,将会在表格视图中列出一个您可以购买的RazeFaces列表。...如果您删除并重新安装该应用程序,“ 还原”按钮将恢复以前购买的任何RazeFaces。 前往Xcode快速查看代码。主视图控制器位于MasterViewController.swift中。...检查您的协议 在将iTunes添加到iTunes Connect中的应用程序之前,您必须执行以下两项操作: 确保您已在developer.apple.com上接受最新的Apple开发计划许可协议。...确保您已在App Store Connect的“协议,税金和结算”部分中接受了最新的付费应用程序协议。 如果您还没有这样做,通常iTunes Connect会给您一个警告,如下所示: ?...转到IAPHelper.swift的最底部(在最后一个大括号之后)并添加以下扩展名: // MARK: - SKPaymentTransactionObserver extension IAPHelper

    5.5K20

    SwiftUI:alert() 和 sheet() 与可选值一起使用

    第二种方法并不经常使用,但是在您需要的时候它确实有用:您可以使用可选的Identifiable对象作为条件,并且当该对象具有值时将显示 Alert 或Sheet 。...它的闭包将为您提供用于条件的非可选值,因此您可以安全地使用它。...为了说明这一点,我们可以创建一个符合Identifiable协议的简易的User结构体: struct User: Identifiable { var id = "Taylor Swift"...= nil 现在,我们可以更改ContentView的body,以便在点击其文本视图时将selectedUser设置为一个值,然后再为selectedUser提供值时使用alert(item:)显示警报...id)) } } } 那是另一个属性,在onTapGesture()中设置另一个值,并在alert()修饰符中强制展开——如果您可以避免这些事情的话那随你好了。

    2.5K40

    ViewBuilder 研究(上)—— 掌握 Result builders

    buildArray(_ components: [Component]) -> Component 用来从一个循环的所有迭代中收集的部分结果。...范例一:AttributedStringBuilder 本例中,我们将创建一个用于声明 AttributedString 的构建器。...其实 Swift 的这种设计有其相当合适的应用领域。在下一篇【 复制 ViewBuilder 】中,我们将看到 ViewBuilder 是如何通过 buildEither 来保存所有分支的类型信息。...首先,我们将创建一个新的协议 —— AttributedText : public protocol AttributedText { var content: AttributedString...在下篇中,我们将尝试复制一个与 ViewBuilder 基本形态一致的构建器,相信复制的过程能让你对 ViewBuilder 以及 SwiftUI 视图有更深的理解和认识。

    3.1K20

    SwiftUI 动画进阶 — Part4:TimelineView

    两者之间的唯一区别是,一个写在内容闭包中,而另一个被放在单独的视图中以提高可读性。...为了解决这个问题,我们更改了 SubView 视图以添加一个参数,该参数将随着时间轴的每次更新而改变。请注意,我们不需要使用参数,它只需要在那里。尽管如此,我们将看到这个未使用的值稍后会非常有用。...笔者将在本节中介绍的技术,使用我们已熟知的动画并且热衷于视图动画从一个时间线更新到下一个时间线。这最终将让我们在纯 SwiftUI 中创建我们自己的类似关键帧的动画。...因此,你可以定义一个具有动画类型的枚举,而不是在数组中包含 Animation 值。稍后在你的视图中,你将根据动画类型创建动画值,但使用偏移值的持续时间对其进行实例化。...我们从最简单的 TimelineView 示例转到视图的一些创造性使用。在第 5 部分中,笔者将探索新的 Canvas 视图,以及它与 TimelineView 的结合程度。

    3.8K30
    领券