확장의 선언은 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의 확장 기능은 다음을 수행 할 수 있습니다.
- 계산 된 인스턴스 속성 및 계산 된 유형 속성 추가
- 인스턴스 메서드 및 형식 메서드 정의
- 새로운 이니셜 라이저 제공
- 아래 첨자 정의
- 새 중첩 유형 정의 및 사용
- 기존 유형이 프로토콜을 준수하도록합니다.
수행하려는 작업은이 코드에서 수행 한 작업과 유사합니다.
class MyClass: UIWindow {
func myFunc() {}
}
extension MyClass {
override func myFunc() {}
}
참고 :override topMostController()
다음 하위 클래스를 만들 려면UIWindow
스위프트 5.0
실제로 OP 코드에는 몇 가지 문제가 있습니다.
UIView
(의 수퍼 클래스 인UIWindow
)에는 methodtopMostController()
가 없으므로 재정의 할 수 없습니다.애플 은
override func
내부를 권장하지 않습니다extension
.확장은 유형에 새 기능을 추가 할 수 있지만 기존 기능을 재정의 할 수는 없습니다.
여전히 확장 기능을 재정의하려는 경우 두 가지 방법이 있습니다.
[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()
}
}
'Program Tip' 카테고리의 다른 글
Maven에서 사용되지 않거나 선언되지 않은 종속성은 무엇입니까? (0) | 2020.11.28 |
---|---|
전역 규칙 유효성 검사를 DDD에 넣을 위치 (0) | 2020.11.28 |
Ruby에서 전체 파일을 읽는 방법은 무엇입니까? (0) | 2020.11.27 |
시스템 전체 umask를 설정하는 방법은 무엇입니까? (0) | 2020.11.27 |
git에서 원격 마스터 브랜치를 삭제할 수 없습니다. (0) | 2020.11.27 |