Как заставить замолчать предупреждение в swift


У меня есть кусок кода, который генерирует много предупреждений (осуждаемого API)

С помощью clang* я мог бы сделать

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

однако это не работает в swift.

Как это сделать в Swift ?

примечание: Я не хочу, чтобы отключить предупреждение глобально, ни даже файл в целом, но просто отключить конкретное предупреждение в определенной части моего исходного кода.

изменить: Похоже, моя записка была недостаточно ясна: я не хочу условно компиляция (которая является предлагаемым ответом предполагаемого дубликата). Я просто хочу заставить замолчать предупреждение без использования новых API.

4 57

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)")