Tag: 文章

将Swift编译时安全变成用户安全

发生了什么? 从技术上讲,今天没有任何事情可以阻止您作为开发人员在未经用户确认的情况下无意或无意进行不可逆的更改(例如删除用户数据)。 当然,我们尝试尽可能地减轻这种风险,在各处编写UIAlertController代码(或者为此目的甚至制作基于可爱的便捷闭包的函数),但是我们编写的API并没有采取任何措施来防止这种情况的发生。 例如,假设我们有一个类Images ,它直接注入到我们的视图控制器中 最终课程图片{ 私人var图片:[UIImage] func图片(位于索引处:Int)-> UIImage { 返回图片[索引] } func add(_ image:UIImage){ images.append(image) } func delete(imageAt index:Int){ images.remove(at:index) } } 当用户点击“删除”按钮时,我们可以轻松地编写以下代码: @objc func didPressDeleteButton(sender:UIButton){ images.delete(imageAt:currentImageIndex) } 没有编译时错误(很明显),没有警告,什么都没有-因此,我们只是删除了一部分用户数据而没有任何确认。 这是不好的。 常规的解决方案是什么? 大多数时候,开发人员会尝试在视图层解决此问题,也就是在didPressDeleteButton UIAlertController那里创建并显示didPressDeleteButton 。 当然,这通常可以解决问题,但是它有明显的缺点: 开发人员可以忘记在某些地方编写此“安全措施”代码。 尽管如此,开发人员仍然可以不小心删除图像,而不是在视图层,而是在业务逻辑中的某个位置删除图像,而无需三思而后行。 那么什么是“正确”的解决方案? 我们真正想要的是我们的Images类,根本不允许未经用户确认而执行删除操作。 为了帮助我们实现该功能,让我们创建一个UserConfirmationRequired结构: struct UserConfirmationRequired { 私人让performDestructiveAction:()->() init(destructiveAction:@escaping()->()){ self.performDestructiveAction =破坏性动作 } func performWithUserConfirmation(alertTitle:字符串,alertMessage:字符串,alertDestructiveActionTitle:字符串,完成:@转义(Bool)->()){ //检索视图控制器以显示警报 保护让窗口= UIApplication.shared.delegate?.window else […]

Swift的情节提要标识符

iOS / macOS开发人员有两种:拥抱故事板的人和鄙视故事板的人。 我是前者,但我一直很讨厌为单元格,视图控制器或segue标识符等使用硬编码的字符串。 因此,我编写了一个脚本,用于分析故事板文件并生成带有所有标识符的Swift文件,以便在代码中更轻松地使用它。 您可以在这里找到代码:https://github.com/unsplash/swift-storyboard-identifiers 生成的.swift文件如下所示: 您可以使用如下标识符: performSegue(withIdentifier: SegueIdentifier.viewItem, sender: sender) 以及类似的情节提要扩展: UIStoryboard.template.instantiateInitialViewController() 而已! 谢谢阅读。

使用Swift结构的简单iOS / macOS应用配置

我从未找到一种方法来保持我认为简单而优雅的应用程序配置。 一些SDK(例如Facebook和Firebase)要求您将值添加到Info.plist文件中。 需要太多代码才能从此文件中检索值。 虽然这些公司似乎可以这样做,但我不是。 最常见的做法是在文件中使用全局变量。 我可以接受,但是我一直认为我们可以做得更好。 去年,我意识到Swift结构提供了一种简单的方法来存储应用程序的配置,从那以后我一直在使用这种技术。 我创建一个Configuration.swift文件,如下所示,其中声明了应用程序中使用的所有配置值。 该文件未提交到Git存储库中,因为它通常包含敏感值。 每个域的配置都拆分为不同的结构声明。 这使得构造和读取文件变得容易。 所有配置域都分组在一个主配置结构中。 这是单个入口点,然后按域向下钻取。 借助自动补全功能,可以轻松在应用程序中的任何位置检索这些值。