Как заставить замолчать предупреждение в swift
У меня есть кусок кода, который генерирует много предупреждений (осуждаемого API)
С помощью clang* я мог бы сделать
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
...
#pragma clang diagnostic pop
однако это не работает в swift.
Как это сделать в Swift ?
примечание: Я не хочу, чтобы отключить предупреждение глобально, ни даже файл в целом, но просто отключить конкретное предупреждение в определенной части моего исходного кода.
изменить: Похоже, моя записка была недостаточно ясна: я не хочу условно компиляция (которая является предлагаемым ответом предполагаемого дубликата). Я просто хочу заставить замолчать предупреждение без использования новых API.
4 ответа:
по состоянию на 2018 год, Xcode 10.0, консенсус заключается в том, что нет никакого способа достичь этого.
я обновлю / отредактирую этот ответ, если Apple добавит эту функцию.
поместите его в свой список пожеланий для WWDC 2019 !
на самом деле, вы можете подавить эти предупреждения с помощью
@available
в заключительной логической структуре (т. е. функции/типа).например, скажем, у вас есть какой-то код, который использует фреймворк адресной книги, но вы строите против iOS 9.
@available(iOS, deprecated: 9.0) func addressBookStatus() -> ABAuthorizationStatus { return ABAddressBookGetAuthorizationStatus() }
начиная с Xcode 7.0.1 это предотвратит отображение встроенных предупреждений.
нет общей конструкции, чтобы заставить замолчать предупреждения об устаревании в Swift, но есть обходной путь, который может быть применен во многих случаях.
допустим, у вас есть метод
getLatestImage()
по классуFoo
, который использует устаревшие методы/классы.использовать
@available
как описал Даниэль Торп, чтобы заставить замолчать все предупреждения внутри методика:@available(iOS, deprecated: 9.0) func getLatestImage() -> UIImage? { ... }
теперь вы хотели бы вызов метод
getLatestImage()
без имея предупреждение об устаревании. Вы можете достичь этого, сначала определив протокол и расширение:private protocol GetLatestImage { func getLatestImage() -> UIImage? } extension Foo: GetLatestImage {}
а затем вызвать метод без предупреждения об устаревании (если
foo
примерFoo
):(foo as GetLatestImage).getLatestImage() // no deprecation warning
в результате у вас есть SWIFT код, который использует устаревший API без предупреждения.
я использовал расширение и значение ключа, чтобы решить эту проблему:
extension UIApplication { var depricated_isStatusBarHidden: Bool { get { return value(forKey: "statusBarHidden") as? Bool ?? false } set { setValue(newValue, forKey: "statusBarHidden") } } }
и просто использовать
UIApplication.shared.depricated_isStatusBarHidden = false
вы можете проверить это с помощью:UIApplication.shared.depricated_isStatusBarHidden = false print("asd: \(UIApplication.shared.isStatusBarHidden)") UIApplication.shared.depricated_isStatusBarHidden = true print("asd: \(UIApplication.shared.isStatusBarHidden)")