Swift Tips 007 - Using #function for UserDefault key consistency

640?wx_fmt=png

代码截图

640?wx_fmt=png


01.png

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

小笔记

这段代码在说什么

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

#function 是什么

#function 是 Swift 编译器为我们提供的一个编译符号,它的作用是描述包含这个符号的方法名称,除了 #function,以外常用的几个编译符号还有 #column#line#file

符号类型描述
#fileString包含这个符号的文件的路径
#lineInt符号出现处的行号
#columnInt符号出现处的列
#functionString包含这个符号的方法名字

在 Swift 3.0 之前,#function 的写法是 __FUNCTION__

这些编译符号怎么用?

可以简单的将这些编译符号理解为一个变量,所以怎么使用变量就怎么使用这些编译符号吧。

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

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

func printLog<T>(message: T,
                    file: String = #file,
                  method: String = #function,
                    line: Int = #line)
{
    print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
}

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

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

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

这样做的好处是什么

说好处之前,我们先想想,如果不用 #function 的话,我们会怎样从 UserDefaults 里取 key 值呢?八成你的代码会如下所示:

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

在这种状况下,我们要自己手动保证 gettersetter 里面 key 值的一致,这就增加了出错的概率。

通过图片里的方式,即使用 #function 作为 key 的话,就很好的保证了 gettersetter 里 key 值的一致问题,我们只需要关心方法名是否为我们需要的 key 即可。

参考资料

[1]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值