Swift를 사용한 하위 클래스 UIApplication


92

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

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

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

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

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


1
app-info.plist UIApplicationMain()아래 NSPrincipalClass에 클래스 이름을 추가하는 것보다 매개 변수 를 변경하는 것이 선호되는 이유는 무엇 입니까?
Andreas

답변:


173

참고 이전 구문을 찾고있는 경우 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)
)

이 메서드의 "빠른 버전"이있는 것처럼 보이므로 AppDelegate.swift 파일에서 UIApplicationMain ()을 직접 호출 할 수 있는지 이해하려고합니다.하지만 컴파일러 오류가 있습니다. 몇 가지 테스트를 수행하겠습니다. "신속한 전용"솔루션 검색
LombaX 2014-06-03

엄청나게 멋지다. sendEvent:요즘 재정의에 대한 사용 사례가 무엇인지 궁금합니다 (iOS 3에서해야했던 것을 기억합니다 ...)
matt

2
경우에는 누군가가 알고 싶어, UIApplicationMain그리고 main.swift스위프트 언어 참조의 특성 섹션에 설명되어 있습니다. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
hujunfeng

힌트를 주셔서 감사합니다. Swift 매뉴얼의 첫 번째 릴리스에서 문서화되지 않았 음을 99 % 확신합니다. :-) 그러나 정보를 추가하여 답변을 업데이트 할 것입니다.
LombaX

5
좋은 대답입니다. XCode 6.3 베타에서 C_ARGCC_ARGV이름이 각각 Process.argc및 로 변경 되었을 수 Process.unsafeArgv있습니다. main.swift 파일에있는 당신의 UIApplicationMain 호출에 업데이트가 필요합니다UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(KBApplication), NSStringFromClass(AppDelegate))
토마스 베어벡

4

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

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

발췌 : Apple Inc.“Swift 프로그래밍 언어.

서브 클래 싱에 대한 요구 UIApplication가 이러한 기능으로 충족 된다면 확장이 갈 길일 수 있습니다.


5
좋은 충고 -하지 응답 이럴 :)
Daij-Djan

1
  1. 의 하위 클래스를 UIApplication만들고 논리 추가

    import UIKit
    
    class CustomUIApplication: UIApplication {
        override func sendEvent(_ event: UIEvent) {
            super.sendEvent(event)
        }
    }
  2. OS에서 호출하는 애플리케이션의 새 진입 점 인 전역 함수 [About]main.swift 을 호출 하는 파일을 만듭니다 . 이 함수는 호출 된 함수, 클래스 이름, 클래스 이름 에서 인수를 받고 메인 런 루프를 시작합니다.UIApplicationMain()UIApplicationUIApplicationDelegate

    import UIKit
    
    UIApplicationMain(
        CommandLine.argc,
        CommandLine.unsafeArgv,
    
        NSStringFromClass(CustomUIApplication.self), //was created at step 1
        NSStringFromClass(AppDelegate.self)
    )
  3. @UIApplicationMain기본 에서 주석을 제거 / 주석 처리합니다 AppDelegate.

    @UIApplicationMain생성 main.swift합니다.

    그렇지 않으면 컴파일 오류가 발생합니다.

    UIApplicationMain 속성은 최상위 코드를 포함하는 모듈에서 사용할 수 없습니다.

    //@UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        //...
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.