2015-07-21 5 views
50

У меня есть кусок кода, который порождающее множество предупреждений (устаревшее API)Как заглушить предупреждение в скор

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

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

Однако это не работает в скор ,

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

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

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

+0

Возможный дубликат [Быстрая альтернатива для диагностики #pragma clang] (http: // stackoverflow.com/questions/28357297/swift-alternative-for-pragma-clang-diagnostic) – robertvojta

+3

Это не дубликат. Другой вопрос не может ответить на эту проблему. –

+0

@ ClausJørgensen, каким образом он не может ответить на эту проблему? Нет другого пути, как указано в ответах в связанном вопросе. Просто условная компиляция или новый макрос '# available', где разработчик должен использовать новые методы и возвращаться к старым, если новые не доступны. – robertvojta

ответ

84

Начиная с 2017 года, Xcode 9.0, консенсус в том, что достичь этого невозможно.

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

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

+10

Черт, это облом. Он выходит из руки [иногда] (http://i.imgur.com/bnpnsf5.png). Это раздражает, если не сказать больше. – Isuru

+2

Я хочу проголосовать за этот ответ миллион раз, но он очень хорошо отвечает на вопрос, так что +1 :-) – deadbeef

+2

@Isuru В этот момент я был бы достаточно раздражен, чтобы просто перестроить все это. Угадайте, что предупреждения работали – Sirens

28

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

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

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

По Xcode 7.0.1 это предотвратит инлайн предупреждение не отображались.

+2

Да, но вы увидите такое же предупреждение, когда вы вызываете свой 'addressBookStatus()' ..., который вы отмечаете как устаревший. –

+1

Pro tip: если вы хотите заставить замолчать его для всего класса, просто сложите этот щенок выше вашего оператора класса (например: 'class ViewController: UIViewController') – Sirens

+2

@Sirens Затем вы увидите это предупреждение каждый раз, когда вы вызываете этот класс ☹ ️ (по крайней мере, с Xcode 8) –

7

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

+0

Так умно. Вид зла? :) Но так хорошо. Отлично подходит для использования, например, для подавления предупреждений о постоянном использовании некоторых аспектов структуры AddressBook, которые были устаревшими, но замена на самом деле не обеспечивает все необходимые функции. Благодарю. –

+0

@ DuncanBabbage Рад, что вам нравится обходной путь! –

Смежные вопросы