扩展 UIApplicationDelegate 协议
Posted
技术标签:
【中文标题】扩展 UIApplicationDelegate 协议【英文标题】:Extending UIApplicationDelegate Protocol 【发布时间】:2016-03-29 11:20:20 【问题描述】:我想扩展UIApplicationDelegate
协议并为application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
方法提供默认实现。但是,我提供的默认实现不会被调用。
是否有可能扩展 UIApplicationDelegate
协议(与 UIApplication
是单例或协议方法是可选的有关),还是我做错了什么?
谢谢
AppDelegate.swift:
import UIKit
extension UIApplicationDelegate
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
print("does not print anything on launch.")
return true
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
var window: UIWindow?
【问题讨论】:
应用程序在创建时是 swift 还是 obj-c?这是您扩展程序中的所有代码吗?你有一个委托实例集,它实现了哪些功能? 想用这个来完成什么,我很好奇?我看不出给 appDelegate 一个默认实现的意义,因为只有 1 个 appDelegate。 @crashoverride777 我想开发一个可以在多个项目中使用 pod 的协议,它提供推送通知相关的功能(比如 UIPushNotificationDelegate)。我还想,在实现者为 UIPushNotificationDelegate 时为 didRegisterForRemoteNotificationsWithDeviceToken 提供默认实现,并使用 UIPushNotificationDelegate 方法作为默认实现将设备令牌发送到服务器。 @Wain 我已经添加了整个 AppDelegate.swift 文件。从一开始它就是一个 Swift 应用程序。项目代码只包含对我的 AppDelegate 文件和 swift Single Page 应用程序模板附带的默认文件的更改。谢谢。 这听起来很有趣。我实际上无法回答您的问题,因为我还没有为 appDelegates 使用协议扩展,所以我不确定它是否真的有效或者您是否犯了错误。 【参考方案1】:事实证明,您无法通过扩展为 Objective-C 协议提供默认实现。有关协议扩展限制的详细列表,请参见下面的链接。
https://www.captechconsulting.com/blogs/ios-9-tutorial-series-protocol-oriented-programming-with-uikit
我们不能做的:为 Objective-C 协议提供默认实现。
【讨论】:
【参考方案2】:我遇到了同样的问题,对于这个特定的文件,我恢复到 Objective-C 来实现这个功能。
#import <UIKit/UIKit.h>
@interface NSObject (BasicMethods) <UIApplicationDelegate>
@end
与
#import "UIApplicationDelegate+BasicMethods.h"
@implementation NSObject (BasicMethods)
- (void)applicationDidFinishLaunching:(UIApplication *)application
NSLog(@"I'm getting called");
@end
有效。
【讨论】:
【参考方案3】:对协议进行扩展是没有用的。 原因是:
协议只包含函数声明,但扩展需要函数定义。 协议只不过是一组规则(方法)。它不分配任何内存。 协议函数定义将在委托类中。所以函数调用永远不会出现在你的函数定义中 写在扩展中。
【讨论】:
那么为什么这个功能甚至存在于语言中?尤其是当我们认为它不是初学者时。以上是关于扩展 UIApplicationDelegate 协议的主要内容,如果未能解决你的问题,请参考以下文章
什么是 Cordova 的 UIApplicationDelegate 等价物
如何在整个程序中使用 UIApplicationDelegate?
其他类中的 UIApplicationDelegate 函数
iPhone:UIApplicationDelegate 和启动图像?
UIApplicationDelegate:是不是有其他应用程序对“注释”的使用记录?
为啥从 UIApplicationDelegate 获取 ManagedObjectContext 的 Apple 文档不好?