本文由海之号角(OceanHorn)翻译自How to make Swift methods unavailable
将一段代码禁用掉而不是通过删掉这段代码有时候是非常方便的。容易想到两种应用场景:
- 对于一个子类,需要将其父类中的某个或某些方法禁用。
- 为了保持对低版本或文档的支持而需要保留的老代码。
在这种情况下我们可以使用 Swift 的可用性声明属性来告知编译器对于标记的对象或方法不要进行编译。
// Swift 2.2
@available(<platform>, unavailable=<version>, message=<message>)
// Swift 3
@available(<platform>, unavailable: <version>, message: <message>)
比如,当你需要创建一个有一个存储型常量属性的 NSObject
子类,需要在实例初始化的时候调用特定的初始化方法完成初始化,并且不希望其他使用者调用默认的init
方法,因为为常量设置一个默认值是行不通的,这时候你就可以将init
方法标记为不可用。
class Dummy: NSObject {
let foo: String
init(foo: String) {
self.foo = foo
}
@available(*, unavailable)
override init() {
fatalError()
}
}
注意到 platform
参数的值为 *
,表示任意平台均不可用。unavailable
参数的值为空,表示方法不可用,无论当前是哪个版本。
不幸的是,对于 Swift 2.2 ,这种可用性声明并没有转换为 Objective-C 属性, 所以 Objective-C 的程序员在调用上述 Swift 代码时可以发现类中的相关方法还是可用的。
如果你读到了本文并且知道如何使得 Swift 代码中的方法在 Swift 和 Objective-C 都可以禁用掉请给作者一个回复Twitter@mokagio。
更多 Swift 相关的声明属性可以在苹果的Swift官方文档处获得。