在里面!不会在 Swift 中被继承

Posted

技术标签:

【中文标题】在里面!不会在 Swift 中被继承【英文标题】:Init! does not get inherited in Swift 【发布时间】:2015-10-13 09:39:13 【问题描述】:

我目前正在试验基于Realm-JSON 的RealmSwift JSON 支持,但被initWithDictionary 卡住了。我将扩展名移至RLMObjectBase,自动生成的swift代码如下所示:

extension RLMObjectBase 
  .....
    public init!(JSONDictionary dictionary: [NSObject : AnyObject]!)
    public func JSONDictionary() -> [NSObject : AnyObject]!

   ....

这对我来说似乎没问题。但是由于某种原因,Realm 的 ObjectRLMObjectBase 的子类)没有继承 init!(JSONDictionary dictionary: [NSObject : AnyObject]!)。它不可用。 任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

子类只有在没有定义自己的初始化器时才继承父类初始化器。

您只能在 RLMObjectBase 类扩展中定义便利初始化器:

extension RLMObjectBase 
    ...
    convenience init!(JSONDictionary dictionary: [NSObject : AnyObject]!)  ... 
    ...

如果没有初始化器,它们将被子类继承:

class MyCustomRLMObject: RLMObjectBase 
   // no initializers
   ...


let object = MyCustomRLMObject(JSONDictionary: d)

此外,如果它仅用于您的应用程序,则无需将其设为 public

类似的例子,但对于UIViewController

extension UIViewController 
    convenience init(nibName: String) 
        self.init(nibName: nibName, bundle: nil)
    


class MyViewController: UIViewController 


let vc = MyViewController(nibName: "MyViewController")

【讨论】:

在这两种情况下,如果子类定义了自己的,就不会继承初始化器? 如果您的子类没有定义初始化器,那么它将继承所有超类初始化器,包括指定的和方便的。 您有什么建议可以避免或解决这个问题? Realm-JSON 写在 obj-c 上。如何以更少的痛苦将其初始化器扩展到 swift

以上是关于在里面!不会在 Swift 中被继承的主要内容,如果未能解决你的问题,请参考以下文章

JS的继承

touchesBegan 在 uiresponder 的子类中被忽略

xmppStreamDidConnect 永远不会在 Swift 中被调用

C++继承不会怎么办?一篇文章带你搞懂C++继承!!!

Swift中构造器的继承和重写

Swift类构造器的继承和重写