Unlike Objective-C, Swift has no preprocessor, so is there still a way to manually deprecate members of a class?
I am looking for something similar to this:
-(id)method __deprecated;
Unlike Objective-C, Swift has no preprocessor, so is there still a way to manually deprecate members of a class?
I am looking for something similar to this:
-(id)method __deprecated;
You can use the Available tag, for example :
@available(*, deprecated)
func myFunc() {
// ...
}
Where * is the platform (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * for all, etc.).
You can also specify the version of the platform from which it was introduced
, deprecated
, obsoleted
, renamed
, and a 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
}
If your project targets multiple platforms, you can use several tags like so :
@available(tvOS, deprecated:9.0.1)
@available(iOS, deprecated:9.1)
@available(macOS, unavailable, message: "Unavailable on macOS")
func myFunc() {
// ...
}
More details in the Swift documentation.
Starting Swift 3 and Swift 4, the version number is optional. You can now simply type:
@available(*, deprecated)
func foo() {
// ...
}
Or if you want a message go along with it:
@available(*, deprecated, message: "no longer available ...")
func foo() {
// ...
}
You can use this to auto-fix you entrys with your new func
@available(*, deprecated, renamed: "myNewFunc")
func myOldFunc() {
// ...
}
func myNewFunc() {
// ...
}
Instead of * you can use swift , for the swift Version number.
Deprecated functions generate warnings but can still be called. (Warning)
Obsolete functions stop it from being called entirely. (Error)
@available(swift, deprecated: 4.0, obsoleted: 4.2, message: "This will be removed in v4.2, please migrate to ...")
or use other Options like iOS, macOS, watchOS, tvOS ...
iOS deprecate
@available(iOS, deprecated:7.0, obsoleted: <ObsoletedVersion>, renamed: "myFuncNew", message: "Please use new method - myFuncNew()")
func myFuncOld() {
//logic
}
If deployment target
[About] == 9.0
and
Deprecate any method/class/struct/protocols using @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.")
Possible params:
For more info see apple doc: Attributes
Original Answer: https://stackoverflow.com/a/56379453/4061501
I wanted to deprecate the default init method from a specific version so I have done the following:
// 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.
}