包含Swift的子类UI应用程序

d7v8vwbk  于 2023-01-25  发布在  Swift
关注(0)|答案(3)|浏览(124)

目标C很简单:更新main.m文件并更改UIApplicationMain()参数就足够了

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

但是在swift中没有main.m文件,因为指南上说
在全局范围内编写的代码用作程序的入口点,因此不需要主函数。
那么,如何在swift中子类化UIApplication??有什么建议吗?

svdrlsy4

svdrlsy41#

XCode 10.1和Swift 5的语法已于2019年6月更新(此处为matt的答案,此处为Tung Fam的答案),如果您正在查找之前的语法,请查看编辑部分。

好吧,我找到解决办法了
首先,我注意到,在AppDelegate.swift文件的顶部有这样一行

@UIApplicationMain

因为这一行在任何作用域之外(它在文件级),所以它被立即执行,并且我假设编译器在标准的main函数中转换它。
因此,我从一个新的Swift-Only应用程序开始:

  • 注解掉@UIApplicationMain
  • 我添加了一个像这样的main.swift文件(FLApplication是我的子类)。
    重要文件必须命名为main.swift,因为顶级语句在其他文件上不受支持!您不能在任何其他文件中添加UIApplicationMain()调用,否则您将收到此错误:

顶级不允许使用表达式
这是主.swift文件

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

然后,使用以下代码为UIApplication子类FLApplication.swift创建一个swift文件:

import UIKit
import Foundation

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

现在,UIApplication已被正确子类化,您将在日志中看到“send event”消息

旧编辑

作为参考,因为从版本1到版本3有很大的变化,我在这里留下了所有以前的编辑

编辑-2015年3月

正如胡俊峰所评论的,关于UIApplicationMain和main.swift文件的解释记录在Swift语言参考的属性部分:Link
正如托马斯Verbeek在XCode 6.3 Beta中所评论的,您可能会发现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月

Xcode 8的解决方案,在beta 6之前

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)
)
ttygqcqt

ttygqcqt2#

另一种选择是扩展UIApplication而不是子类化它,根据苹果发布的iBook,Swift中的扩展可以:
添加计算属性和计算静态属性定义示例方法和类型方法提供新的初始值设定项定义下标定义和使用新的嵌套类型使现有类型符合协议
摘录自:苹果公司“Swift编程语言。
如果您对UIApplication进行子类化的需求可以通过这些功能来满足,那么扩展可能是一个不错的选择。

qjp7pelc

qjp7pelc3#

Swift子类UI应用程序

1.创建UIApplication的子类并添加逻辑

import UIKit

class CustomUIApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
    }
}

1.创建调用UIApplicationMain()全局函数About(https://stackoverflow.com/a/60988242/4770877)的main.swift文件,该函数是操作系统调用的应用程序的新入口点。此函数从被调用函数、UIApplication类名、UIApplicationDelegate类名接收参数,并启动主RunLoop About(https://stackoverflow.com/a/75204210/4770877)。

import UIKit

UIApplicationMain(
    CommandLine.argc,
    CommandLine.unsafeArgv,

    NSStringFromClass(CustomUIApplication.self), //was created at step 1
    NSStringFromClass(AppDelegate.self)
)

1.删除/注解默认AppDelegate上的@UIApplicationMain注解。
@UIApplicationMain生成main.swift
如果您不这样做,您将得到一个编译错误:
不能在包含顶级代码的模块中使用UIApplicationMain特性

``` Swift
//@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    //...
}

相关问题