신속하게 경고를 침묵시키는 방법


98

많은 경고를 생성하는 코드가 있습니다 (사용되지 않는 API).

clang *을 사용하여 할 수 있습니다.

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

그러나 이것은 신속하게 작동하지 않습니다.

신속하게 수행하는 방법?

참고 : 경고를 전역 적으로 또는 파일 전체에서 비활성화하고 싶지 않고 소스 코드의 특정 부분에서 특정 경고를 비활성화하기 만하면됩니다.

편집 : 내 메모가 충분히 명확하지 않은 것 같습니다. 조건부 컴파일을 원하지 않습니다 (추상 된 중복에 대한 제안 된 답변). 새 API를 사용하지 않고 경고를 무음으로 설정하고 싶습니다.



4
이것은 중복이 아닙니다. 다른 질문은이 문제에 대한 답이 아닙니다.
Claus Jørgensen 2015

@ ClausJørgensen이 어떤 방식 으로이 문제에 대답하지 못합니까? 연결된 질문의 답변에 명시된 다른 방법은 없습니다. #available개발자가 새 메서드를 사용하고 새 메서드를 사용할 수없는 경우 이전 메서드로 대체해야하는 조건부 컴파일 또는 새 매크로입니다.
zrzka

@robertvojta 아니, 대답은 마찬가지로, 사실, 하지 경고를 침묵하는 다른 방법이 상태 없다는 것을.
Claus Jørgensen 2015

2
이것은 속임수가 아닙니다. 이니셜 라이저 누락에 대한 경고가 표시되는 상황은 어떻습니까?
NSTJ 2015 년

답변:


161

2020 년부터 Xcode 12.0에서는이를 달성 할 방법이 없다는 것이 합의되었습니다.

Apple이 기능을 추가하면이 답변을 업데이트 / 편집하겠습니다.

WWDC 2021 위시리스트에 넣으십시오!


22
젠장, 그건 안타까운 일이다. 가끔 손이 빠지기 합니다. 최소한으로 말하는 것은 성가신 일입니다.
Isuru

2
나는이 답변을 백만번에 반대하고 싶지만 질문에 대한 답이 꽤 잘되어 있기 때문에 +1 :-)
deadbeef

3
@Isuru 그 시점에서 나는 모든 것을 재건하기에 충분히 짜증을 낼 것입니다. 경고가 효과가
Sirens

1
@Isuru 대부분은 수정해야하며 무시해서는 안됩니다.
케빈

3
너무 답답 해요! 이 답변을 업데이트 해 주셔서 감사합니다.
Dan Loewenherz

48

Swift에서 deprecation 경고를 침묵시키는 일반적인 구조는 없지만 많은 경우에 적용 할 수있는 해결 방법이 있습니다 .

사용되지 않는 메서드 / 클래스를 사용 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

그 결과 폐기 경고없이 폐기 된 API를 사용하는 Swift 코드가 있습니다.


매우 영리한. 일종의 악? :)하지만 너무 좋아요. 더 이상 사용되지 않는 AddressBook 프레임 워크의 일부 측면의 지속적인 사용에 대한 경고를 억제하는 것과 같은 사용 사례에 적합하지만 교체가 실제로 필요한 모든 기능을 아직 제공하지는 않습니다. 감사.
Duncan Babbage 2017 년

4
이게 효과가 있으면 좋아하는 음료 6 팩을 보내 드릴게요. 당신은 뛰어난 마음을 가지고 있습니다. 감사합니다.

@John 친절한 말에 감사드립니다! 작동합니다. 코드베이스에서 경고를 오류로 처리 할 때 문제를 해결해야했습니다. 여전히 사용되지 않는 라이브러리를 사용하는 섹션이 하나 있습니다.
Tammo Freese

1
@John 그에게 식스 팩을 보냈습니까? : P 굉장합니다. 천재. 감사.
Baran Emre

당신은 사악한 천재입니다.
Krypt

37

실제로 둘러싸는 논리 구조 (예 : 함수 / 유형) 를 사용하여 이러한 경고를 억제 할 수 있습니다@available .

예를 들어 AddressBook 프레임 워크를 사용하는 코드가 있지만 iOS 9에 대해 빌드한다고 가정 해 보겠습니다.

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

Xcode 7.0.1부터는 인라인 경고가 표시되지 않습니다.


6
당신이 당신의 전화 할 때 네,하지만 당신은 같은 경고가 표시됩니다 addressBookStatus()... 사용되지 않는 것처럼 표시 있음.
Valentin Shergin 2015 년

3
프로 팁 : 당신이 전체 클래스를 침묵 할 경우 당신의 클래스 문 위 (예 :이 강아지를 슬램 class ViewController: UIViewController)
사이렌

2
@Sirens 그러면이 클래스를 호출 할 때마다이 경고가 표시됩니다. ☹️ (적어도 Xcode 8에서는)
Alexander Vasenin

합니까 누군가는 침묵에 성공 모든 이 수정되지 않는 경고를? 나는 그들의 수를 1 개로 줄일 수 있었지만, 마지막 것을 제거 할 방법을 찾지 못했습니다. 어떤 제안?
Alexander Vasenin 2016 년

1
그래서 이것을 사용하여 " 'CGFloat.NativeType'(일명 'Double')에서 관련없는 유형 'Float'으로의 캐스트는 항상 실패합니다." 라는 경고를 무음으로 만들if CGFloat(0).native is Float { … }있습니까? 답 : 질문에 답하지 않았기 때문에 사용하지 않습니다.
Slipp D. Thompson 2017

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 및 OS를 테스트하여 더 이상 사용되지 않는 API를 계속 사용할 수 있고 대체되지 않았는지 확인할 수 있습니다.

단점이 있으면 의견을 말하십시오.


수완을 위해 찬성하지만 내 입에 더러운 맛을 남길 것입니다 : P
Matt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.