与Objective-C不同,Swift没有预处理器,那么还有没有一种方法手动弃用类的成员?
我正在寻找类似于这样的东西:
-(id)method __deprecated;
与Objective-C不同,Swift没有预处理器,那么还有没有一种方法手动弃用类的成员?
我正在寻找类似于这样的东西:
-(id)method __deprecated;
@available(*, deprecated)
func myFunc() {
// ...
}
其中 * 是平台名称(iOS、iOSApplicationExtension、macOS、watchOS、tvOS、* 表示全部等)。
您也可以指定该平台被引入、弃用、过时、重命名以及相关信息的版本号,具体方法是使用 introduced
、deprecated
、obsoleted
、renamed
和 message
:
@available(iOS, deprecated:6.0)
func myFunc() {
// calling this function is deprecated on iOS6+
}
Or
@available(iOS, deprecated: 6.0, obsoleted: 7.0, message: "Because !")
func myFunc() {
// deprecated from iOS6, and obsoleted after iOS7, the message "Because !" is displayed in XCode warnings
}
如果你的项目面向多个平台,你可以这样使用多个标签:
@available(tvOS, deprecated:9.0.1)
@available(iOS, deprecated:9.1)
@available(macOS, unavailable, message: "Unavailable on macOS")
func myFunc() {
// ...
}
在Swift文档中有更多细节。
=
被替换为:
。 - Sam Soffes*,已弃用:10.0
将在 iOS 10
、tvOS 10
等中弃用它,我猜我们不应该将 *
与版本号结合使用。有更好的想法吗? - fabb@available(iOS, deprecated:9.1) @available(tvOS, deprecated:9.0.1)
- Axel Guilmin@available(*,deprecated: 10.0)
因此对于不仅在iOS上运行代码的情况来说是一个非常糟糕的想法。 - fabb从 Swift 3 和 Swift 4 开始,版本号是可选的。您现在可以简单地键入:
@available(*, deprecated)
func foo() {
// ...
}
或者如果你想附带一条信息:
@available(*, deprecated, message: "no longer available ...")
func foo() {
// ...
}
@available(*, deprecated, message = "no longer available ...")
。 - Daniel Zhang@available(*, deprecated, renamed: "myNewFunc")
func myOldFunc() {
// ...
}
func myNewFunc() {
// ...
}
你可以使用 swift 代替 *,swift 版本号为版本号。
已弃用的函数会产生警告,但仍然可以调用。(警告)
过时的函数将导致无法调用。(错误)
@available(swift, deprecated: 4.0, obsoleted: 4.2, message: "This will be removed in v4.2, please migrate to ...")
iOS 废弃警告
@available(iOS, deprecated:7.0, obsoleted: <ObsoletedVersion>, renamed: "myFuncNew", message: "Please use new method - myFuncNew()")
func myFuncOld() {
//logic
}
部署目标
[关于]== 9.0
并且:
<ObsoletedVersion>
== 10.0
- 警告
<ObsoletedVersion>
== 8.0
- 编译错误
使用@available
弃用任何方法/类/结构体/协议
@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }
@available(*, deprecated, renamed: "loadData")
func fetchData() { }
@available(swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }
@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")
可能的参数:
更多信息请参见苹果文档:属性
// Old Method to be deprecated
@available(*, unavailable, message: "This method has been deprecated from version 2.0.0. Please use new init method as init(param1:param2:)")
@objc public override init() {
super.init()
/**
* This fatalError has been thrown if anyone is using this function in Objective-C and initializes this with the following syntax.
* MyClass *classObj = [MyClass new];
*/
fatalError("This method has been deprecated from version 2.0.0. Please use new init method as init(param1:param2:)")
}
// New init method
@objc public required init(param1: String, param2: String) {
super.init()
// New init method logic goes here.
}