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

Swift 单元测试入门

在 Swift 中编写单元测试 有多种方法可以测试相同的结果,但是当测试失败时它并不总是给出相同的反馈。以下提示可帮助您编写测试,通过从详细的失败消息中获益,帮助您更快地解决失败的测试。...有多种设置和拆卸方法的变体供您选择,例如支持并发的变体或抛出变体,如果设置失败,您可以在其中提前使测试失败。...let cache = SearchQueryCache(userDefaults: userDefaults) /// ... write the test } } 这样做可以确保您不会操纵在模拟器上测试期间使用的标准用户默认值...它会阻止您编写 XCTAssertNotNil 并结合解包或处理其余测试代码的条件链接。我鼓励您阅读我的文章 《如何使用 XCTest 在 Swift 中测试可选值》以了解更多详细信息。...您的测试代码与您的应用程序代码一样重要 在深入探讨实用技巧之后,我想介绍一种必要的心态。就像编写应用程序代码一样,您应该尽最大努力编写高质量的测试代码。

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

    UserDefaults 浅析及其使用管理

    前言 Hi Coder,我是 CoderStar! 我想每一个 iOSer 对UserDefaults都有所了解,但大家真的完全了解它吗?下面,我谈谈我对UserDefaults的看法。...其中需要注意的是UserDefaults对数据的操作影响plist文件的改变这一过程是异步的,也就是说你修改了UserDefaults某一个 key 的值,紧接着去获取这个 key 的值,得到的也会是修改后的值...下面介绍两种UserDefaults使用管理的两种方式。 protocol 利用 Swift 中protocol可以有默认实现的特性,可以对UserDefaults进行有效的管理。...UserDefaults.standard.removeObject(forKey: key) } } 上述协议主要是将UserDefaults的数据存取操作在协议中定义出来,并给出了协议默认方法实现...在取值的方法上借鉴了SwiftyJSON的思想,为每种基本结构提供可选值及非可选值两种方式,在使用时可根据自己的使用场景灵活使用。 我们如何进行使用呢?见下方代码示例,相关说明见注释。

    1.2K10

    开关组件对比

    大部分情况下开发的时候,是用UserDefaults存储一个bool值,用于判断。...这种情况下,做法是启动的时候调用服务端的接口,在返回的接口数据中存储对应的值,使用时直接获取存储的值。...}) // 使用时 // 获取存储的值,用于判断 对比 而在09|开关组件:如何使用功能开关,支持产品快速迭代中,作者把开关组件分为了三类:编译时开关、本地开关和远程开关 编译时开关:让编译器通过检查编译条件来启动后者关闭一些功能...// 可以注意userDefaults.register方法的使用,赋默认值 self.userDefaults.register(defaults: [...对比未抽象前的操作,会发现,未抽象前的就像打游击战,遍地开花,想要找到一个开关组件的地方,需要对业务代码熟悉,才能通过搜索找到对应地方。

    95811

    使用Codable归档Swift对象

    UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据时——例如自定义Swift类型——我们需要做更多的工作。...整数,布尔值(真或假)和Double也是如此。这些值的数组和字典也很容易想到:一个字符串,然后是另一个,然后是第三个,依此类推。...我们将在未来的项目中更多地研究Codable,但是目前我们的需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults中,然后在从UserDefaults中返回时将其取消存档。...在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储在UserDefaults中。 要将用户数据转换为JSON数据,我们需要在JSONEncoder上调用encode()方法。...,我们可以创建一个将用户存档的按钮,并将其保存到UserDefaults中,如下所示: Button("Save User") { let encoder = JSONEncoder()

    2.1K30

    使用 Codable 归档 Swift 对象

    UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据时——例如自定义Swift类型——我们需要做更多的工作。...整数,布尔值(真或假)和Double也是如此。这些值的数组和字典也很容易想到:一个字符串,然后是另一个,然后是第三个,依此类推。...我们将在未来的项目中更多地研究Codable,但是目前我们的需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults中,然后在从UserDefaults中返回时将其取消存档。...在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储在UserDefaults中。 要将用户数据转换为JSON数据,我们需要在JSONEncoder上调用encode()方法。...,我们可以创建一个将用户存档的按钮,并将其保存到UserDefaults中,如下所示: Button("Save User") { let encoder = JSONEncoder()

    1.2K20

    肘子的 Swift 周报 #053| 打破年度发布制度:科技创新的新起点

    前一期内容|全部周报列表 原创 SwiftUI 中的 UserDefaults 与 Observation:如何实现精准响应[4] Fatbobman(东坡肘子)[5] 在 SwiftUI 中,苹果提供的...本文将探讨如何在 Observation 框架下高效且便捷地管理 UserDefaults 中的数据,并提出一个完整而实用的解决方案:@ObservableDefaults[6]。...Swift 编程中数组(Array)和集合(Set)的区别,并深入介绍了它们在常见操作中的使用方式。...虽然数组是最常用的集合类型,但集合也有其独特的优势,尤其是在性能和避免重复值方面。 什么是 Swift 中的依赖注入?(What is dependency injection in Swift?)...在本文中,Donny Wals 介绍了在 Swift 中实现依赖注入的不同方式,并探讨了每种方式的优缺点。

    3500

    Swift 中的属性包装器

    除此之外,唯一真正的要求是每个属性包装类型应该包含一个名为wrappedValue的存储属性,该属性告诉 Swift 要包装的是哪个底层值。...例如,假设我们正在开发一个消息应用程序,它使用 Foundation 的 UserDefaults API在磁盘上存储各种用户设置和其他轻量级数据。...然而,通过在通用属性包装器中实现这种逻辑,我们可以使其易于重用——因为这样做可以让我们简单地将包装器附加到任何希望由UserDefaults支持的属性。...上面的设置使我们的新属性包装器易于使用,只要我们希望一个属性由用户默认值.standard,但由于我们参数化了该依赖关系,如果愿意,我们还可以选择使用自定义实例——例如,为了方便测试,或者能够在同一应用程序组中的多个应用程序之间共享值...我们所要做的就是将defaultValue属性添加到包装器中,然后在底层UserDefaults存储不包含属性键的值时使用它。

    2.7K30

    Kotlin 的 Property Delegate 与 Swift 的 Property Wrapper

    更神奇的是,Kotlin-Native 居然支持了与 Objective-C 的互调用,进而也就相当于某种意义上支持了与 Swift 的互调用,这下它们就更亲密了。 Swift:我不是我没有别瞎说。...我们同样可以通过被代理的属性名来查询对应 key 在 Properties 文件中的值,这个逻辑与 SharedPreferences 如出一辙,大家有兴趣可以参考这里:AbsProperties.kt...其实对于 setter 的代理的场景还真有,例如对于 Android 中某些 View 的属性只有 setter 的方法,没有对应的 getter,如果我想要做一个属性动画,那么这样的属性代理就会比较有帮助...说来也有趣,在它的设计文档中还特意 "diss" 了 Kotlin 的属性代理的语法设计:单独为了属性代理搞了一个 by 关键字实在是有些重,在其他场景下也不太好复用,于是 Swift 的属性包装器采用了与...稍微提一句,在 Swift 中,struct 是值类型,class 是引用类型,对于属性包装器来讲,二者都是可以的,用哪个取决于具体需求。

    5.3K20

    肘子的 Swift 周报 #061|离开手机的两个小时

    在上期周报[3]中,我曾感慨当前电子设备过度智能化的问题。然而此刻我反思,作为社会中的一个个体,我何尝不是已将自己的生活和工作方式,与这种智能体验紧密绑定? 居安思危。...面对这一趋势,作为一名博主,我需要借助工具来简化在不同社交媒体平台上的内容发布和管理。过去一个月里,我开始使用 Typefully 来完成这一工作。在本文中,我将分享使用过程中的一些心得与体会。...★在 BlueSky 上关注我:@fatbobman.bsky.social[6] 近期推荐 并发逐步解析:从存储中读取数据 (Concurrency Step-by-Step: Reading from...Storage)[7] 许多开发者在迁移到 Swift 6 模式后,往往被各种并发相关的问题困扰。...通过提供一个强大的@Shared属性包装器,Sharing 库帮助开发者在应用的多个模块之间高效共享状态,并支持将数据持久化到外部存储系统(如 UserDefaults、文件系统等)。

    6210

    iOS开发之WidgetKit

    介绍 WidgetKit 通过在 iOS 主屏幕或 macOS 通知中心放置小部件,让用户可以随时访问 App 中的内容。Widget 可以保持更新,从而让用户获得最新信息。...此时会生成一个新文件夹,包含以下内容 扩展名.swift 扩展名.intentdefinition Assets.xcassets Info.plist 数据共享 可以通过网络和本地数据两种方式进行数据的共享...配置 App 在Signing&Capabilities中打开App Groups,内容一般为group.Bundle Identifier。...WidgetConfiguration:有两类配置,分别为 StaticConfiguration : 可以在不需要用户任何输入的情况下自行解析,可以在 Widget 的 App 中获取相关数据并发送给...policy 参数,意思是在什么时候尝试丢弃当前时间线并获取一个新的时间线,可以选择.never,.atEnd 或 .after。

    2.7K32

    iOS开发之WidgetKit补充

    在 iOS 14 正式版发布之前我写了一篇博文《iOS开发之WidgetKit》,iOS 14 正式版发布以后,经测试,Apple 改变了 Widget 的 API,所以本文进行一个补充说明(在前文的基础上做了修改...介绍 WidgetKit 通过在 iOS 主屏幕或 macOS 通知中心放置小部件,让用户可以随时访问 App 中的内容。Widget 可以保持更新,从而让用户获得最新信息。...此时会生成一个新文件夹,包含以下内容 扩展名.swift 扩展名.intentdefinition Assets.xcassets Info.plist 数据共享 App 与 Widget 可以通过网络数据和本地数据两种方式进行数据的共享...WidgetConfiguration:有两类配置,分别为 StaticConfiguration : 可以在不需要用户任何输入的情况下自行解析,可以在 Widget 的 App 中获取相关数据并发送给....configurationDisplayName:设置 Widget 在添加界面中显示的标题。 .description::设置 Widget 在添加界面中显示的描述。

    2K30

    iOS 多国语言本地化与App内语言切换(Swift)写在前面前言准备工作storyboardxib本地化纯代码本地化语言切换后记

    写在前面 本文同步 个人博客 简书 掘金 慕课 使用Xcode 9.3 Swift4.1 前言 语言本地化 大家肯定都多少都听过,今天我要分享的是快速实现语言本地化,与App内语言切换 核心内容主要是三个部分...中的文本转为swift格式的常量,存入一个临时文件 sed "s/^\"/ static var localized_/g" "${localizableFile}" | sed "s/\" = \"...iOS中多语言本地化流程的优化 语言切换 语言切换的基本原理是使用Userdefault存储当前选择的语言,在设置的时候改变其内容即可 主要涉及到两个问题 storyboard/xib如何切换语言..., 在具体的en和zh中写具体内容,这时Base的作用就是为了方便自动生成代码而已了。...中的文本转为swift格式的常量,存入一个临时文件 sed "s/^\"/ static var localized_/g" "${localizableFile}" | sed "s/\" = \"

    2.5K31

    解决 iOS 15 上 APP 莫名其妙地退出登录

    1、UserDefaults 中的数据被清除。 2、一个意外的API调用返回HTTP 401并触发退出登录。 3、Keychain 抛出了一个错误。...登录界面没有要求我选择地区——这表明UserDefaults中的数据没有问题,因为我们的 "已显示地区选择 "偏好设置仍然生效。...在10.58.0和10.59.0版本中,受影响的用户数量慢慢减少,这是由于我们在努力确定根本原因时引入了一项缓解措施,该措施在10.60.0中得到了修复。 此时,我能够捕捉到返回的确切错误代码。...现在这完全说得通了,但唯一的问题是,在 Cookpad 中,我们只在应用启动时从Keychain中读取信息,而我的假设是,用户一定是点击了应用图标来启动应用,因此设备在这时应该总是解锁的,对吗?...在能够复现问题的场景中,我观察到以下结果: main.swift — 失败 (errSecInteractionNotAllowed) AppDelegate.init() — 失败 (errSecInteractionNotAllowed

    93810
    领券