티스토리 뷰

Property type 'CustomWindow *' is incompatible with type 'UIWindow * _Nullable' inherited from 'UIWindowSceneDelegate'

위 워닝은 AppDelegate는 Objective-C코드로 되어있고 CustomWindow는 Swift코드로 되어있을 때 나타나고 있습니다.

 

문제 상황

앱의 최상단에 뷰를 띄우기 위해 UIWindow에 뷰를 붙여서 사용하고 있었습니다.

그러나 window의 rootViewController를 바꾸게 되면 최상단에 붙어있던 뷰가 rootViewController 밑으로 들어가면서 사용자가 볼 수 없었죠.

이 문제를 해결하기 위해 rootViewController를 바꿀 때 마다 붙어있던 뷰를 bringSubviewToFront() 메소드를 이용해서 앞으로 옮겨줘야 합니다.

window.rootViewController = newViewController
window.bringSubViewToFront(topView)

매번 직접 뷰를 상단으로 옮겨오다 보면 실수하거나 다른 작업자가 누락시킬 가능성이 있겠죠.

그래서 UIWindow를 상속받아 rootViewController를 바꿀 때 bringSubviewToFront() 메소드가 함께 동작하도록 했습니다.

class CustomWindow: UIWindow {

	private var topView: UIView?

	override var rootViewController: UIViewController? {
    	didSet {
        	if let topView = self.topView {
	        	self.brintSubViewToFront(topView)
            }
        }
    }
}

AppDelegate의 window 타입도 변경했습니다.

@class CustomWindow;

@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>

@property (strong, nonatomic) CustomWindow * window;

@end

Property type 'CustomWindow *' is incompatible with type 'UIWindow * _Nullable' inherited from 'UIWindowSceneDelegate'

여기에서 워닝이 나타나고 있습니다!

 

추측되는 원인으론 UIWindowSceneDelegate (UIApplicationDelegate)에서 스토리보드로 window의 rootViewController를 만들 경우 UIWindow 타입을 내려주는데 CustomWindow 타입으로 다운캐스팅에 대한 워닝이 나타나는 것 같습니다.

 

해결

아무래도 명확하게 코드를 작성할 수 없지만 AppDelegate에서 window를 UIWindow 타입으로 돌려주고 window를 사용하는 쪽에서 타입캐스팅을 하면 워닝을 제거할 수 있습니다.

if let window = appDelegate.window as? CustomWindow {
	// Do Something
}