programing

스위프트에서 경고를 침묵시키는 방법은 무엇입니까?

telecom 2023. 5. 10. 20:15
반응형

스위프트에서 경고를 침묵시키는 방법은 무엇입니까?

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

clang*을 사용하면 다음을 수행할 수 있습니다.

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

그러나 Swift에서는 이 기능이 작동하지 않습니다.

스위프트에서는 어떻게 합니까?

참고: 경고를 전체적으로 비활성화하거나 파일 전체에서 비활성화하지 않고 소스 코드의 특정 부분에서 특정 경고를 비활성화합니다.

저는 조건부 컴파일을 원하지 않습니다(이는 추정된 중복의 제안된 답변입니다).새 API를 사용하지 않고 경고를 잠재우려고 합니다.

2022년 현재 Xcode 14.x, Swift 5.x에서는 이를 달성할 수 있는 직접적인 방법이 없다는 데 의견이 일치하고 있습니다.

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

WWDC 2023에 대한 위시리스트에 올려보세요!

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

방법이 getLatestImage() 중에Foo더 이상 사용되지 않는 방법/방법을 사용합니다.

사용하다@availableDaniel Thorpe가 메소드 내부의 모든 경고를 침묵시키기 위해 설명한 것처럼:

class Foo {
    @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

Foo의 정적 속성/함수를 호출하려는 경우:

(Foo.self as GetLatestImage.Type).someStaticProperty

그 결과, 사용되지 않는 API를 사용하는 Swift 코드를 사용하여 사용 중지 경고가 발생하지 않습니다.

실제로 다음을 사용하여 이러한 경고를 억제할 수 있습니다.@available포함하는 논리 구조(즉, 함수/유형).

예를 들어, 주소록 프레임워크를 사용하는 코드가 있지만 iOS 9를 기반으로 빌드하고 있다고 가정해 보십시오.

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

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

클래스 또는 구조체 외부의 최상위 기능에 문제가 있었습니다.

@available(*, deprecated)
func GetImage(url: URL) -> UIImage? { ... }

애플의 엔지니어와 이야기를 해봤는데 프로토콜로 구현을 숨기고 확장 기능을 사용하지 않는 것으로 표시할 수 있다고 합니다.작동 방식을 살펴보겠습니다.

  1. 래핑할 함수에 대해 유사한 서명이 있는 프로토콜을 만듭니다.
  2. 확장의 모든 클래스 또는 구조체에 프로토콜을 사용합니다.
  3. 확장을 사용하지 않음으로 표시합니다.

확장에 포함된 모든 항목에 사용 중지 경고가 표시되지 않습니다.

protocol ImageStoreProtocol {
    func imageFromURL(_ url: URL) -> UIImage?
}

class ImageStore {}

@available(*, deprecated)
extension ImageStore: ImageStoreProtocol {
    func imageFromURL(_ url: URL) -> UIImage? {
        return GetImage(url: url) // Warning does't show up
    }
}

현재로서는 Swift에서 사용되지 않는 경고를 침묵시킬 방법이 없지만 기술적으로 헤더 파일을 편집하여 특정 기호에 대해 그렇게 할 수 있습니다.

  • 사용되지 않는 기호 이름 복사
  • 선택한다.File>Open Quickly
  • 기호를 붙여넣고 를 누릅니다.Enter

    빨리 열기 상자에서 Swift 아이콘을 사용하지 않도록 설정했는지 확인합니다.

  • 선택한다.File>Show in Finder

  • 필요한 경우 편집할 수 있도록 파일 권한 변경
  • 기호에 대한 사용되지 않는 매크로를 편집합니다.자세한 내용은 주변 API를 참조하십시오.예: 교체:

__OSX_Available_BUT_DEPRECATED(__MAC_10_6, __MAC_10_10, __IPPONE_3_0, __IPPONE_8_0)

와 함께

__OSX_Available_STARTING(__MAC_10_6, __IPONE_3_0)

이제 여러분이 할 수 있는 한 가지 덜 산만한 경고가 있습니다.

알아요, 더러워요.하지만 현재 SDK에서 사용할 수 있는 대체 API가 없다면 안전할 것입니다.일단 새로운 버전의 Xcode가 나오면, 변경 사항은 덮어쓰게 되고 당신은 다시 경고를 보게 될 것입니다.그런 다음 새 SDK와 OS를 테스트하여 사용되지 않는 API를 계속 사용할 수 있는지 확인하고 대체할 수 있습니다.

단점이 있다면 댓글을 달아주세요.

언급URL : https://stackoverflow.com/questions/31540446/how-to-silence-a-warning-in-swift

반응형