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

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

Использование clang * Я мог бы сделать

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

Однако это не работает быстро.

Как это сделать быстро?

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

Изменить: Мне кажется, что моя заметка была недостаточно ясной: я НЕ хочу условной компиляции (которая является предлагаемым ответом предполагаемого дубликата). Я просто хочу отключить предупреждение БЕЗ использования новых API.

Ответ 1

По состоянию на 2017 год, Xcode 9.0, консенсус в том, что для этого не существует способа.

Я обновлю/отредактирую этот ответ, если Apple добавит эту функцию.

Поместите его в свой список пожеланий для WWDC 2018!

Ответ 2

Собственно, вы можете подавить эти предупреждения, используя @available в охватывающей логической структуре (т.е. функции/типа).

Например, скажем, у вас есть код, который использует структуру AddressBook, но вы создаете против iOS 9.

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

Как и в Xcode 7.0.1, это предотвратит отображение встроенных предупреждений.

Ответ 3

В Swift нет общей конструкции для молчания предупреждений об устаревании, но есть обходное решение, которое может быть применено во многих случаях.

Скажем, у вас есть метод getLatestImage() в классе Foo, который использует устаревшие методы/классы.

Используйте @available, как описано Daniel Thorpe, чтобы отключить все предупреждения внутри метода:

@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 без каких-либо предупреждений об отказе.