如何手动废弃成员

186

与Objective-C不同,Swift没有预处理器,那么还有没有一种方法手动弃用类的成员?

我正在寻找类似于这样的东西:

-(id)method __deprecated;

这个回答解决了你的问题吗?如何在Xcode中弃用一个方法 - Lal Krishna
6个回答

304
您可以使用“Available”标签,例如:

@available(*, deprecated)
func myFunc() { 
    // ...
}

其中 * 是平台名称(iOS、iOSApplicationExtension、macOS、watchOS、tvOS、* 表示全部等)。

您也可以指定该平台被引入、弃用、过时、重命名以及相关信息的版本号,具体方法是使用 introduceddeprecatedobsoletedrenamedmessage

@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文档中有更多细节。


在Swift 3中,=被替换为: - Sam Soffes
2
*,已弃用:10.0 将在 iOS 10tvOS 10 等中弃用它,我猜我们不应该将 * 与版本号结合使用。有更好的想法吗? - fabb
1
这不是真的。从你提供的文档中可以看到:“指定平台的版本”。 - fabb
@fabb 不好意思,这是iOS版本,你可以像这样组合多个标签:@available(iOS, deprecated:9.1) @available(tvOS, deprecated:9.0.1) - Axel Guilmin
1
回到我的原点,@available(*,deprecated: 10.0)因此对于不仅在iOS上运行代码的情况来说是一个非常糟糕的想法。 - fabb
显示剩余2条评论

80

Swift 3Swift 4 开始,版本号是可选的。您现在可以简单地键入:

@available(*, deprecated)
func foo() {
    // ...
}

或者如果你想附带一条信息:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}

1
对于Swift 2.3,版本号也是可选的。 - DawnSong
3
对于Swift 2.3,当包含一条消息时,语法似乎是@available(*, deprecated, message = "no longer available ...") - Daniel Zhang
@Daniel,苹果修改了部分内容但仅称其为2.3,这很奇怪。我将再次更新答案,感谢提醒! - Yuchen

6
您可以使用此功能自动修复您的条目。
@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、macOS、watchOS、tvOS等。

3

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 - 编译错误

输入图像说明 (如果是版本10.0

输入图像说明 (如果是版本8.0


如果选择“obsolete”选项,则无法使用它。根据此,该选项未实现。https://bugs.swift.org/browse/SR-8168 - mkjwa

0

Swift 5.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.")

可能的参数:

  • introduced
  • deprecated
  • obsoleted
  • message
  • renamed

更多信息请参见苹果文档:属性

原始答案:https://dev59.com/VG445IYBdhLWcg3wUYrM#56379453


0
我想要在特定版本中弃用默认的init方法,因此我已经执行了以下操作:
// 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.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接