转自:http://imtx.me/archives/1916.html
半年前在第一时间接触 Swift,还参与过一次主题演讲(见《和 Swift 亲密接触的这半个月…》)不过很快这股新鲜劲过后就中断了。事隔几月,因为最近正在抓紧时间完成我的那个用 Swift 写的微博客户端,于是我又开始好好的学习和使用 Swift 了。
正所谓掌握一样技术最好的办法就是用它来做一个东西,于是这段时间的实战让我对 Swift 的理解更深了一层,也积累了一些使用技巧。今天就分享一则:如何正确地定义一个类变量(和类常量)。
Swift 语言对于无论是静态语言过来还是动态语言过来的开发者来说,都有点点不适应,很多问题的解决思路不能用已经习以为常的方法去做。比如一个很常用的:如何定义类变量(和类常量)?
Swift 支持用 class func 来修饰一个「类方法」,然而却不能用「class var」和「class let」来指定类变量和类常量,一旦你尝试这样做了,那么 Xcode 会提示你:Class variable not yet supported。真是遗憾…
不过从这个提示可以看出,Class variable 的支持只是时间问题。那么现阶段我们要怎么完成这一目标?总不能用丑陋的 Workaround 吧。办法还是有的,我从 Apple 官方的例子中学到了如何去定义一个类级的常量和变量,那就是用 struct。
来个 demo 你就明白了:
class MyClass {
struct Constants {
static let name = "MyClass"
}
struct Variables {
static var age = 0
}
}
然后在调用的时候,就可以这样来调用: MyClass.Constants.name 和 MyClass.Variables.age
虽然中间还隔了一层 Constants 和 Variables,但是我觉得这样也挺好,相当于有了一个 Prefix,直接看代码时就知道是常量还是变量了。如果你不喜欢这种方式,也可以用 computed property 的形式来模拟真实的类变量(常量)的调用。比如:
extension MyClass {
class var name: String {
get {
return Constants.name
}
}
class var age: Int {
get {
return Variables.age
}
set {
Variables.age = newValue
}
}
}
定义了这种方式后,就可以直接用 MyClass.name 和 MyClass.age 来访问类常量或修改类变量了。
这种方式在语法上兼容了未来会得到支持的类变量和类常量,但就是自己要写一大堆 getter 和 setter,有点麻烦,大家可以根据自己的需要决定是不是要采用这种方式。
关于本文的 demo 代码,大家可以粘贴进「swift」这个命令行工具来实践一下。效果正如我们想要的那样,常量不允许修改,变量可以修改,所有的这些操作都是在 MyClass 上进行,而不需要实例化。
虽然现在用 Swift 来做一些常用的任务还略显麻烦,不过作为一个年轻的语言,目前它确实已经能用在生产环境中写出真正可用的 App 了,随着接下去的发展,我相信它会变得越来越好的。
PS:现在我只想 SourceKitService 崩溃的少一点…