programing

Xcode 8 / Swift 3 : "유형 UIView Controller 표현?is unused" 경고

golfzon 2023. 4. 9. 22:36
반응형

Xcode 8 / Swift 3 : "유형 UIView Controller 표현?is unused" 경고

저는 아래 기능을 가지고 있습니다.이 기능은 이전에 컴파일 되어 있었지만, Xcode 8로 경고가 발생하고 있습니다.

func exitViewController()
{
    navigationController?.popViewController(animated: true)
}

"유형식"UIView Controller?"는 사용되지 않습니다.

왜 이런 말을 하고 있고 제거할 방법이 있나요?

코드는 예상대로 실행됩니다.

TL;DR

popViewController(animated:)돌아온다UIViewController?값을 캡처하지 않았기 때문에 컴파일러가 경고를 보냅니다.해결책은 밑줄에 할당하는 것입니다.

_ = navigationController?.popViewController(animated: true)

Swift 3 변경

Swift 3 이전에는 모든 메서드가 기본적으로 "폐기 가능한 결과"를 가지고 있었습니다.메서드에서 반환된 내용을 캡처하지 않은 경우 경고가 발생하지 않습니다.

컴파일러에게 결과를 캡처해야 한다는 것을 알려주기 위해서는@warn_unused_result메서드 선언 전.가변형식의 메서드에 사용됩니다(예: sort그리고.sortInPlace)를 추가합니다.@warn_unused_result(mutable_variant="mutableMethodHere")컴파일러에게 말할 수 있습니다.

그러나 Swift 3에서는 동작이 반전됩니다.이제 모든 메서드가 반환값이 캡처되지 않음을 경고합니다.컴파일러에 경고가 필요없음을 통지하려면@discardableResult메서드 선언 전.

반환값을 사용하지 않으려면 컴파일러에 값을 언더스코어에 할당하여 명시적으로 알려야 합니다.

_ = someMethodThatReturnsSomething()

이를 Swift 3에 추가하는 동기:

  • 발생할 수 있는 버그 방지(예: 사용)sort컬렉션을 변경한다고 생각한다)
  • 다른 공동작업자를 위해 결과를 캡처하지 않거나 캡처할 필요가 없다는 명확한 의도

UIKit API가 뒤에 있는 것 같습니다.추가되지않았습니다.@discardableResult완전히 정상적인(더 흔하지는 않더라도) 사용을 위해popViewController(animated:)반환값을 캡처하지 않습니다.

더 읽기

삶이 당신에게 레몬을 줄 때, 확장하라:

import UIKit

extension UINavigationController {
    func pop(animated: Bool) {
        _ = self.popViewController(animated: animated)
    }

    func popToRoot(animated: Bool) {
        _ = self.popToRootViewController(animated: animated)
    }
}

다음과 같은 것을 추가하는 것에 주의해 주세요.@discardableResult func pop(animated: Bool) -> UIViewController?회피하려고 하는 경고와 같은 결과가 됩니다.

확장자를 사용하면 다음과 같이 쓸 수 있습니다.

func exitViewController()
{
    navigationController?.pop(animated: true)
}

func popToTheRootOfNav() {
    navigationController?.popToRoot(animated: true)
}

편집: popToRoot도 추가되었습니다.

Swift 3에서는 반환값이 선언된 함수의 반환값을 무시하면 경고가 발생합니다.

이 옵션을 해제하는 방법 중 하나는 이 기능을@discardableResult기여하다.당신은 이 기능을 제어할 수 없기 때문에, 그것은 동작하지 않습니다.

경고문구를 으로는 '알다'의 을 '알다'에 이 있습니다._이것은 메서드가 값을 반환한다는 것을 알고 있지만 메모리에 보관하고 싶지 않다는 것을 컴파일러에 알립니다.

let _ = navigationController?.popViewController(animated: true)

스크린샷 1

work correctly if kept as it is, ★★★★★★★★★★★★★★★★.number of warning increases.

은 간단히 말하면 .replace it with underscore ( _ )못생긴 것 같지만요.

Eg.  _ = navigationController?.popViewController(animated: true)

스크린샷 2

이 상태에서는 discardableResult를 사용합니다.

<Swift Programming Language>에 따르면 Language Reference - Attributes 장을 참조하십시오.

폐기 가능 결과

값을 반환하는 함수 또는 메서드가 결과를 사용하지 않고 호출될 때 컴파일러 경고를 억제하려면 함수 또는 메서드 선언에 이 속성을 적용합니다.

<Swift Programming Language>의 Language Guide - Methods 에도 데모가 있습니다.

@discardableResult
mutating func advance(to level: Int) -> Bool {
    ...
    return true
}

어드밴스(to:) 메서드를 호출하는 코드가 반환값을 무시하는 것은 반드시 실수가 아니기 때문에 이 함수는 @discardableResult 속성으로 마크됩니다.이 속성에 대한 자세한 내용은 속성을 참조하십시오.

CodeReaper의 확장 CodeReaper를 해야 .@descardableResult이렇게 하면 모든 가능성이 유지되지만 경고는 사라집니다.

import UIKit

extension UINavigationController {
    @discardableResult func pop(animated: Bool) -> UIViewController? {
        return self.popViewController(animated: animated)
    }

    @discardableResult func popToRoot(animated: Bool) -> [UIViewController]? {
        return self.popToRootViewController(animated: animated)
    }
}

다른 을 풀 수.self.navigationController?하여 ""를 호출합니다.popViewController★★★★★★ 。

if let navigationController = navigationController {
    navigationController.popViewController(animated: true)
}

언급URL : https://stackoverflow.com/questions/37843049/xcode-8-swift-3-expression-of-type-uiviewcontroller-is-unused-warning

반응형