在里面!不会在 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 的 Object
(RLMObjectBase
的子类)没有继承 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 中被继承的主要内容,如果未能解决你的问题,请参考以下文章
touchesBegan 在 uiresponder 的子类中被忽略