当前位置:  开发笔记 > IOS > 正文

NSNotification子类与Swift 2.1中的Generics

如何解决《NSNotification子类与Swift2.1中的Generics》经验,为你挑选了1个好方法。

无法使用Generic payload对象创建NSNotification的子类.获取运行时错误或编译错误(请参阅下面的代码中的注释).甚至可以使用Swift 2.1吗?任何想法都赞赏.谢谢!

运行时错误,因为NSNotification是抽象类(类集群).
编译错误,因为应该使用指定的初始化程序.

public class Notification: NSNotification {

    private var _name: String
    private var _object: AnyObject?
    private var _payload: T?

    public override var name: String {
        return _name
    }

    public override var object: AnyObject? {
        return _object
    }

    public var payload: T? {
        return _payload
    }

    /// Always nil. Use payload
    public override var userInfo: [NSObject : AnyObject]? {
        return nil
    }

    /// Change to false to "swap" implementation
    #if true

    init(name: String, object: AnyObject? = nil, payload: T? = nil) {
        _name = name
        _object = object
        _payload = payload
        /*
          Runtime error:
          Terminating app due to uncaught exception
          'NSInvalidArgumentException', reason:
          '*** initialization method -initWithName:object:userInfo:
          cannot be sent to an abstract object of class
          _TtGC14__lldb_expr_1612NotificationSS_:
          Create a concrete instance!'
        */
        super.init(name: name, object: object, userInfo: nil)
    }

    #else

    convenience init(name: String, object: AnyObject? = nil, payload: T? = nil) {
        self.init()
        _name = name
        _object = object
        _payload = payload
    }

    init() {
        /// compiler error:
        /// must call a designated initializer of the superclass
        /// But using designated initializer cause runtime error listed above.
        super.init() 
    }

    #endif
}


let n = Notification(name: "xyz", payload: "Hello")

Ian Henry.. 8

从文档中,强调我的:

NSNotification除了通知名称,对象和字典之外,您还可以子类化以包含信息.这些额外数据必须在通知者和观察者之间达成一致.

NSNotification是一个没有实例变量的类集群.因此,你必须继承NSNotification和覆盖原始的方法name,objectuserInfo.您可以选择任何您喜欢的指定初始化程序,但请确保您的初始化程序不会调用[super init].NSNotification并不意味着直接实例化,它的init方法引发了异常.

NSNotification现在没有办法从Swift代码中获得子类,因为Swift没有"uninitializable类"的概念,并要求所有子类调用它们的超类init(在这种情况下,这是错误的事情).

您必须在Objective-C中编写子类并将其桥接到Swift代码中.

不幸的是,即使您可以声明Objective-C类是通用的,该信息也会在桥接过程中丢失.来自文档:

除了这些Foundation集合类之外,Swift还忽略了Objective-C轻量级泛型.使用轻量级泛型的任何其他类型都会导入到Swift中,就好像它们是未参数化的一样.

:(



1> Ian Henry..:

从文档中,强调我的:

NSNotification除了通知名称,对象和字典之外,您还可以子类化以包含信息.这些额外数据必须在通知者和观察者之间达成一致.

NSNotification是一个没有实例变量的类集群.因此,你必须继承NSNotification和覆盖原始的方法name,objectuserInfo.您可以选择任何您喜欢的指定初始化程序,但请确保您的初始化程序不会调用[super init].NSNotification并不意味着直接实例化,它的init方法引发了异常.

NSNotification现在没有办法从Swift代码中获得子类,因为Swift没有"uninitializable类"的概念,并要求所有子类调用它们的超类init(在这种情况下,这是错误的事情).

您必须在Objective-C中编写子类并将其桥接到Swift代码中.

不幸的是,即使您可以声明Objective-C类是通用的,该信息也会在桥接过程中丢失.来自文档:

除了这些Foundation集合类之外,Swift还忽略了Objective-C轻量级泛型.使用轻量级泛型的任何其他类型都会导入到Swift中,就好像它们是未参数化的一样.

:(

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有