Swift Tips 007 - Using #function for UserDefault key consistency

2021年11月23日 阅读数:3
这篇文章主要向大家介绍Swift Tips 007 - Using #function for UserDefault key consistency,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

代码截图


01.png

代码出处: Swift Tips 007 by John Sundell[1]git

小笔记

这段代码在说什么

这段代码为 UserDefaults 进行了扩展,并为其增长了一个名称为 onboardingCompleted,类型为 BOOL 的计算属性,用于获取 UserDefaults 里是键名为 onboardingCompleted 的值github

#function 是什么

#function 是 Swift 编译器为咱们提供的一个编译符号,它的做用是描述包含这个符号的方法名称,除了 #function,之外经常使用的几个编译符号还有 #column#line#fileweb

符号 类型 描述
#file String 包含这个符号的文件的路径
#line Int 符号出现处的行号
#column Int 符号出现处的列
#function String 包含这个符号的方法名字

在 Swift 3.0 以前,#function 的写法是 __FUNCTION__swift

这些编译符号怎么用?

能够简单的将这些编译符号理解为一个变量,因此怎么使用变量就怎么使用这些编译符号吧。微信

代码截图里展现了若是在方法里面使用编译符号,下面的代码将展现如何在方法定义里使用编译符号。flex

这里假设咱们要打印出某个方法的相关信息,例如它所在的文件名称,调用方名称,当前行数等。ui

func printLog<T>(message: T,
file: String = #file,
method: String = #function,
line: Int = #line)

{
print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
}

那么它的输出结果就会是这样的spa

// Test.swift
func method() {
//...
printLog("这是一条输出")
//...
}

// 输出:
// Test.swift[62], method(): 这是一条输出

这样作的好处是什么

说好处以前,咱们先想一想,若是不用 #function 的话,咱们会怎样从 UserDefaults 里取 key 值呢?八成你的代码会以下所示:.net

extension UserDefaults {
var onboardingCompleted: Bool {
get { return bool(forKey:"onboardingCompleted") }
set { set(newValue, forKey: "onboardingCompleted") }
}
}

在这种情况下,咱们要本身手动保证 gettersetter 里面 key 值的一致,这就增长了出错的几率。3d

经过图片里的方式,即便用 #function 做为 key 的话,就很好的保证了 gettersetter 里 key 值的一致问题,咱们只须要关心方法名是否为咱们须要的 key 便可。

参考资料

[1]

Swift Tips 007 by John Sundell: https://github.com/JohnSundell/SwiftTips#7-using-function-for-userdefaults-key-consistency


本文分享自微信公众号 - 一瓜技术(tech_gua)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。