Program Tip

확장의 선언은 Swift 4의 오류를 무시할 수 없습니다.

programtip 2020. 11. 28. 10:16
반응형

확장의 선언은 Swift 4의 오류를 무시할 수 없습니다.


확장 기능이 있습니다.

public extension UIWindow {
    override public func topMostController()->UIViewController? { ... }
}

하지만 내 topMostController경우 다음 오류가 발생합니다.

Declarations in extensions cannot override yet error

Swift 3.1에서는 잘 작동하지만 Swift 4에서는이 오류가 발생합니다. 어떻게 고칠 수 있습니까? Swift 4에서 변경된 사항은 무엇입니까?


기본 구현을하면 작동합니다 @objc. 내부에 대한 자세한 설명은 Hamish의 답변참조하십시오 .

확장에 선언 된 메서드를 재정의하는 것은 올바르게 수행하기가 약간 까다 롭습니다. Objective-C는이를 지원하지만 절대적으로 안전하지는 않습니다. Swift는 더 나은 것을 목표로합니다. 제안이 아직 완료되지 않았습니다.

여기 에서 현재 버전의 제안을 볼 수 있습니다 .


확장은 유형에 새 기능을 추가 할 수 있지만 기존 기능을 재정의 할 수는 없습니다.

확장은 기존 클래스, 구조, 열거 또는 프로토콜 유형에 새로운 기능을 추가합니다. 여기에는 원본 소스 코드에 대한 액세스 권한이없는 유형을 확장하는 기능이 포함됩니다 (소급 모델링이라고 함).

Swift의 확장 기능은 다음을 수행 할 수 있습니다.

  • 계산 된 인스턴스 속성 및 계산 된 유형 속성 추가
  • 인스턴스 메서드 및 형식 메서드 정의
  • 새로운 이니셜 라이저 제공
  • 아래 첨자 정의
  • 새 중첩 유형 정의 및 사용
  • 기존 유형이 프로토콜을 준수하도록합니다.

Apple 개발자 가이드

수행하려는 작업은이 코드에서 수행 한 작업과 유사합니다.

class MyClass: UIWindow {
    func myFunc() {}
}

extension MyClass {
    override func myFunc() {}
}

참고 :override topMostController() 다음 하위 클래스를 만들 려면UIWindow


스위프트 5.0

실제로 OP 코드에는 몇 가지 문제가 있습니다.

  1. UIView(의 수퍼 클래스 인 UIWindow)에는 method topMostController()가 없으므로 재정의 할 수 없습니다.

  2. 애플 override func 내부를 권장하지 않습니다extension .

    확장은 유형에 새 기능을 추가 할 수 있지만 기존 기능을 재정의 할 수는 없습니다.

  3. 여전히 확장 기능을 재정의하려는 경우 두 가지 방법이 있습니다.

[A]@objc dynamic func 부모 클래스에서 함수 표시 :

class Vehicle {
    @objc dynamic func run() { /* do something */ }
}

class Car: Vehicle { }

extension Car {
    override func run() { /* do another thing */ }
}

[B]의 자손 인 내장 클래스에서 함수를 재정의합니다 NSObject.

 extension UIWindow {
    // UIWindow is a descendant of NSObject, and its superclass UIView has this function then you can override
    override open func becomeFirstResponder() -> Bool {
        ...
        return super.becomeFirstResponder()
    }
 }

참고 URL : https://stackoverflow.com/questions/44616409/declarations-in-extensions-cannot-override-yet-error-in-swift-4

반응형