【问题标题】:Extending UIApplicationDelegate Protocol扩展 UIApplicationDelegate 协议
【发布时间】: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)。我还想扩展 UIApplicationDelegate 协议,在实现者为 UIPushNotificationDelegate 时为 didRegisterForRemoteNotificationsWithDeviceToken 提供默认实现,并使用 UIPushNotificationDelegate 方法作为默认实现将设备令牌发送到服务器。
  • @Wain 我已经添加了整个 AppDelegate.swift 文件。从一开始它就是一个 Swift 应用程序。项目代码只包含对我的 AppDelegate 文件和 swift Single Page 应用程序模板附带的默认文件的更改。谢谢。
  • 这听起来很有趣。我实际上无法回答您的问题,因为我还没有为 appDelegates 使用协议扩展,所以我不确定它是否真的有效或者您是否犯了错误。

标签: ios swift uiapplicationdelegate protocol-extension


【解决方案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】:

      对协议进行扩展是没有用的。
      原因是:

      1. 协议只包含函数声明,但扩展需要函数定义。
      2. 协议只不过是一组规则(方法)。它不分配任何内存。
      3. 协议函数定义将在委托类中。所以函数调用永远不会出现在你的函数定义中 写在扩展中。

      【讨论】:

      • 那么为什么这个功能甚至存在于语言中?尤其是当我们认为它不是初学者时。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2017-08-21
      • 1970-01-01
      相关资源
      最近更新 更多