Як швидко замовкнути попередження


98

У мене є шматок коду, який генерує багато попереджень (застарілий API)

За допомогою clang * я міг би це зробити

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

Однак це не працює швидко.

Як це зробити швидко?

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

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



4
Це не дублікат. Інше питання не дає відповіді на цю проблему.
Клаус Йоргенсен

@ ClausJørgensen, яким чином він не відповідає на цю проблему? Немає іншого способу, як зазначено у відповідях на пов'язане запитання. Просто умовна компіляція або новий #availableмакрос, де розробник повинен використовувати нові методи і повертатися до старих, якщо нові недоступні.
zrzka

@robertvojta Ні, оскільки відповіді насправді не стверджують, що немає інших способів замовкнути попередження.
Клаус Йоргенсен,

2
Це не обман. А як щодо ситуації, коли вам дають попередження про відсутність ініціалізатора?
NSTJ

Відповіді:


157

Станом на 2020 рік, Xcode 12.0, консенсус полягає в тому, що цього неможливо досягти.

Я оновлю / редагую цю відповідь, якщо Apple додасть цю функцію.

Внесіть це у свій список бажань для WWDC 2021!


21
Блін, це облом. Він отримує збився руку іноді . М’яко кажучи, це дратує.
Ісуру

2
Я хочу мільйон разів проголосувати за цю відповідь, але вона відповідає на запитання досить добре, тому +1 :-)
deadbeef

3
@Isuru У той момент я був би роздратований досить, щоб просто перебудувати все це. Вгадайте, попередження спрацювали
Сирени

1
@Isuru Більшість із них слід виправити, а не ігнорувати.
кевін

3
Так розчаровує! Дякуємо за підтримку цієї відповіді.
Dan Loewenherz,

48

У 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 без жодних попереджень про припинення використання.


Такий розумний. Вид зла? :) Але так добре. Відмінно підходить для випадків використання, таких як придушення попереджень щодо постійного використання деяких аспектів фреймворку AddressBook, які застаріли, але їх заміна насправді ще не забезпечує усієї необхідної функціональності. Дякую.
Duncan Babbage

4
якщо це спрацює, я надішлю вам шість пачок вашого улюбленого напою. у вас видатний розум, сер, дякую.
Джон

@ John Спасибі за добрі слова! Це працює, мені довелося його придумати, оскільки ми розглядаємо попередження як помилки в нашій кодовій базі, і в одному розділі все ще використовується застаріла бібліотека.
Таммо Фріз

1
@ Джон, ти прислав йому шість пакетів? : P Це приголомшливо. Геніальність. Дякую.
Баран Емре

Ти злий геній.
Крипт

37

Насправді ви можете придушити ці попередження, використовуючи @availableвкладену логічну структуру (тобто функцію / тип).

Наприклад, припустімо, що у вас є якийсь код, який використовує фреймворк AddressBook, але ви будуєте для iOS 9.

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

Починаючи з Xcode 7.0.1, це не дозволить відображати вбудовані попередження.


6
Так, але ви побачите те саме попередження, коли зателефонуєте своєму addressBookStatus()..., яке ви позначите як застаріле.
Валентин Шергін

3
Про порада: якщо ви хочете , щоб змусити замовкнути його для всього класу просто грюкнути цей щеня вгору вище вашого клас заяви (наприклад: class ViewController: UIViewController)
Сирени

2
@Sirens Тоді ви будете бачити це попередження кожного разу, коли дзвоните в цей клас ☹️ (принаймні з Xcode 8)
Олександр Васенін

Чи вдалося комусь замовкнути всі застарілі попередження за допомогою цього виправлення? Мені вдалося зменшити їх кількість лише до одного , але я не бачу способу позбутися останнього. Будь-які пропозиції?
Олександр Васенін

1
Отже, як використовувати це, щоб заглушити попередження ", передане з" CGFloat.NativeType "(він же" Double ") на не пов'язаний тип" Float "завжди не працює", коли я роблю if CGFloat(0).native is Float { … }? Відповідь: Я не використовую це, тому що ви не відповіли на запитання.
Сліпп Д. Томпсон,

1

Хоча наразі в Swift немає можливості приглушити попередження про припинення використання, технічно ви можете зробити це для певного символу, відредагувавши файл заголовка.

  • Скопіюйте застаріле ім'я символу
  • Виберіть File>Open Quickly
  • Вставте символ і натисніть Enter

    Переконайтеся, що піктограма Swift відключена у полі Відкрити швидко

  • Виберіть File>Show in Finder

  • Змініть дозволи на файл, щоб дозволити редагування, якщо це необхідно
  • Відредагуйте застарілі макроси для символу. Див. Навколишні API для довідки. Наприклад, заміна:

__OSX_AVAILABLE_BUT_DEPRECATED (__ MAC_10_6, __MAC_10_10, __IPHONE_3_0, __IPHONE_8_0)

з

__OSX_AVAILABLE_STARTING (__ MAC_10_6, __IPHONE_3_0)

Зараз є одне менш відволікаюче попередження, з яким ви нічого не можете зробити.

Я знаю, це брудно. Але якщо в поточному SDK немає доступного API для заміни , це повинно бути безпечно. Як тільки вийде нова версія Xcode, зміна буде перезаписана, і ви знову побачите попередження. Потім ви можете протестувати нові SDK та ОС, щоб переконатися, що застарілий API все ще доступний і не отримав заміну.

Будь ласка, коментуйте, якщо у вас є якісь мінуси.


Голосуючи за винахідливість, але це залишило б у мене в роті брудний смак: P
Метт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.