AppDelegate.swift 如何在 Xcode 6.3 中替换 AppDelegate.h 和 AppDelegate.m

Posted

技术标签:

【中文标题】AppDelegate.swift 如何在 Xcode 6.3 中替换 AppDelegate.h 和 AppDelegate.m【英文标题】:How does AppDelegate.swift replace AppDelegate.h and AppDelegate.m in Xcode 6.3 【发布时间】:2015-05-22 03:49:52 【问题描述】:

根据ios Developer Library

应用委托是您编写自定义应用级代码的地方。与所有类一样,AppDelegate 类在应用程序的两个源代码文件中定义:在接口文件 AppDelegate.h 和实现文件 AppDelegate.m 中。

然而,在 Xcode 6.3 中似乎只有 AppDelegate.swift 而不再是 .h 和 .m 扩展名。我想了解 .swift 如何替换 .h 和 .m 扩展名。

【问题讨论】:

【参考方案1】:

简单的答案是 AppDelegate.swift 只是 Objective-C AppDelegate.hAppDelegate.m 的翻译,因为 Swift 不需要单独的头文件和实现,而是需要一个 .swift 文件。

但是,在底层,两者之间还有其他关键区别。

在 Objective-C 中,存在一个 main.m 文件,其唯一目的是实例化 UIApplicationMain

在 Swift 中,位于 AppDelegate.swift 顶部的 @UIApplicationMain 注释标签取代了 Objective-C 中 main.m 文件中存在的任何 main 函数的需要。如果省略此标记,您可以使用 main.swift 文件通过指定的 App Delegate 实例化您的 UIApplication

main.swift 实现如下所示:

import UIKit

autoreleasepool 
    UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))

【讨论】:

嗯,如何将这个 main.swift 注册到 Xcode 进行编译? 啊,“Process”现在应该是“CommandLine”,但 CommandLine.unsafeArgv 的类型与 UIApplicationMain 对参数 2 的预期类型略有不同。:/【参考方案2】:

Swift 旨在消除其他语言中遇到的大量代码重复。头文件可能是查看代码接口的一种简单方法,但它们在很大程度上重复了实现,此外还会导致两者之间的不匹配问题。在 Swift 中,接口和实现是一回事,在同一个文件中。

【讨论】:

【参考方案3】:

Object-C 以前有 .h 和 .m 文件,现在在 swift 中不再是这种情况了,swift 不需要头文件(.h),所有代码都在 .swift 文件中。

您发布的链接中的教程与 Object-C 项目有关,而不是 swift 项目。

如果您想快速执行这些步骤,也许this document 对您来说是一个更好的起点

【讨论】:

【参考方案4】:

如果您使用 Swift 语言,并且在制作项目时选择了该语言,您将只有一个 Swift 文件,没有其他文件可用于委托。

如果您选择 Objective-C,那么您将拥有两个单独的文件,H 和 M,就像以前的 Xcode 版本一样(它们没有 Swift)

区别在于:

在 Objective-C 中,一个文件用于声明(头文件 | .H),一个用于实现(主文件 | .M)。

在新的 Swift 语言中,声明和实现在同一个文件中(Swift File | .swift),所以 Swift 改进了这个结构。

其实这两种语言在运行时在delegate上没有区别,但是Swift更容易学习。

有关 Swift 的更多信息,请从 iBooks Store 下载这本书:

Swift 编程语言(Apple Inc.)

【讨论】:

【参考方案5】:

在 Swift 3 Xcode 8.3 下我是这样使用的

import UIKit

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

【讨论】:

以上是关于AppDelegate.swift 如何在 Xcode 6.3 中替换 AppDelegate.h 和 AppDelegate.m的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AppDelegate.swift 路由到任何视图控制器

如何将 AppDelegate Swift 代码放入 Objective-C AppDelegate 文件并使其工作?

如何通过 Swift 扩展实现委托方法

从 appdelegate swift 访问 UIwebview

在 AppDelegate (Swift) 中切换视图

Swift - 在 AppDelegate 中实例化视图控制器