Programing

Swift를 사용한 하위 클래스 UIApplication

crosscheck 2020. 9. 12. 09:08
반응형

Swift를 사용한 하위 클래스 UIApplication


Objective C에서는 간단했습니다. main.m 파일을 업데이트하고 UIApplicationMain () 매개 변수를 변경하는 것으로 충분했습니다.

return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));

그러나 신속하게 main.m 파일이 없습니다.

"글로벌 스코프에서 작성된 코드는 프로그램의 진입 점으로 사용되므로 주 기능이 필요하지 않습니다."

그렇다면 UIApplication을 신속하게 하위 클래스로 만드는 방법은 무엇입니까 ?? 어떠한 제안?


참고 이전 구문을 찾고 있다면 2019 년 6 월 XCode 10.1 및 Swift 5에 대한 구문이 업데이트되었습니다 ( 여기 에서 matt의 답변 && Tung Fam의 답변에 대한 크레딧 ).

네, 해결책을 찾았습니다

먼저 AppDelegate.swift 파일의 맨 위에 다음 줄이 있습니다.

@UIApplicationMain

이 줄은 범위 밖에 있기 때문에 (파일 수준에 있음) 즉시 실행되며 컴파일러가 표준 주 함수로 변환한다고 가정합니다.

그래서 저는 새로운 Swift-Only 애플리케이션에서 시작하여 이렇게했습니다.

  • 주석 처리 @UIApplicationMain
  • 다음과 같은 main.swift 파일을 추가했습니다 (FLApplication은 내 하위 클래스입니다).
    중요 파일 이름은 main.swift로 지정해야합니다. 다른 파일에서는 최상위 문이 지원되지 않기 때문입니다! 다른 파일 내에 UIApplicationMain () 호출을 추가 할 수 없습니다. 그렇지 않으면 다음 오류가 발생합니다.

최상위 수준에서는 식을 사용할 수 없습니다.

이것은 main.swift 파일입니다.

UIApplicationMain(
    CommandLine.argc, CommandLine.unsafeArgv, 
    NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)

그런 다음 다음 코드를 사용하여 UIApplication 하위 클래스 인 FLApplication.swift에 대한 신속한 파일을 만듭니다.

import UIKit
import Foundation

class FLApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
        print("send event")
    }
}

이제 UIApplication이 올바르게 서브 클래 싱되고 로그에 "send event"메시지가 표시됩니다.


OLD EDITS
참고로, 이것은 버전 1에서 버전 3으로 많이 변경 되었으므로 여기에 모든 이전 편집을 남겨 둡니다.


편집-2015 년 3 월

Hu Junfeng이 주석을 달았 듯이, 이제 UIApplicationMainmain.swift 파일 에 대한 설명은 The Swift Language Reference : Link 의 Attributes 섹션에 문서화되어 있습니다.

Thomas Verbeek의 설명대로 XCode 6.3 베타에서 C_ARGC 및 C_ARGV가 각각 Process.argc 및 Process.unsafeArgv로 이름이 변경되었음을 알 수 있습니다. main.swift 파일의 UIApplicationMain 호출은 다음으로 업데이트해야합니다.

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))

XCode 8 이전 구문은

import Foundation
import UIKit

UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))

수정-2016 년 12 월

베타 6 이전의 Xcode 8 솔루션

import Foundation
import UIKit

UIApplicationMain(
    CommandLine.argc,
    UnsafeMutableRawPointer(CommandLine.unsafeArgv)
        .bindMemory( 
            to: UnsafeMutablePointer<Int8>.self, 
            capacity: Int(CommandLine.argc)),
    NSStringFromClass(FLApplication.self),
    NSStringFromClass(AppDelegate.self)
)

한 가지 대안은 UIApplication서브 클래 싱하는 대신 확장 하는 것입니다. Apple에서 출시 한 iBook 에 따르면 Swift의 확장 기능은 다음을 수행 할 수 있습니다.

Add computed properties and computed static properties Define instance methods and type methods Provide new initializers Define subscripts Define and use new nested types Make an existing type conform to a protocol

Excerpt From: Apple Inc. “The Swift Programming Language.

If your needs in subclassing UIApplication are satisfied by those capabilities, an Extension might be the way to go.

참고URL : https://stackoverflow.com/questions/24020000/subclass-uiapplication-with-swift

반응형