带有协议和keyPath()的更安全的Swift应用程序设置

协议+ #keyPath +计算属性=强大的用户设置💪

保持应用程序设置同步,持久化以及分配默认值可能会变得混乱。 UserDefaults是一种存储非敏感应用程序设置的好方法。 但是,由于其本质是键值结构,因此我们需要诉诸使用字符串存储数据的方法。

FL红旗!

这是一个等待发生的问题。 简单的拼写错误可能会导致我们访问无效值,或者无法正确更新值。

使UserDefaults更安全👷

Swift 3及更高版本配备了出色的#keyPath()表达式。 这可以使我们避免以类型安全的方式在UserDefaults中使用字符串。

#keyPath()仍使用Objective-C运行时,并将解析为其引用的路径的字符串。 因此,密钥需要通过@objc装饰器公开给Objective-C。 将密钥包装在协议中可以使我们公开整个协议并干净地访问它们:

越来越好…

好。 所以这可行。 目前可能看起来有些令人费解,但是使用协议将使我们可以为下一步使用一个干净的接口。

添加计算属性

“正在计算…” –🤖

使用此约定,我们可以让协议定义我们的设置,无论它们是Bools,String还是其他。 然后,我们可以创建一个符合协议的对象AppSettings ,并使用计算的属性,可以安全地直接从UserDefaults设置和获取变量!

编译器还将强制执行协议,以确保您不会忘记实现所有设置! 👍

哦,看起来很好

我们的设置现在真的开始变得生动起来了。 您还将注意到,如果UserDefaults中不存在,我们的useAmbientLight变量将被设置为false -这是我们可以为每个设置指定默认值的方式!

设置可以轻松检索!

十分简单。

更深入

大! 我们有一种方法可以轻松安全地存储,设置和检索变量。 但是其他类型,例如字符串呢? 如果您有很多设置怎么办?

破坏我们的协议并使用扩展可以帮助清理我们的课程。 使用上面编写的value(for key:)函数,我们可以轻松获取任何其他UserDefault支持的对象(如String),甚至是Optionals的设置!

完整的例子

包起来

#keyPath,协议和计算属性的组合是为您的Swift应用程序中的设置提供强大功能的强大功能组合。

添加设置就像将其添加到现有协议或创建新协议一样容易。 如果您忘记实现一个,编译器甚至会警告您。

希望这种有趣的实现设置的方式在您的应用中同样有用useful。