在Swift中,为什么我需要重写此初始化程序才能创建自己的便捷初始化程序?

维克·史密斯

我有这个课:

class MyStoryboard: UIStoryboard {
   override init() {
        super.init(name: "SomeName", bundle: nil);
    }
}

Swift不接受此设置,因为我没有调用指定的初始化程序。但是UIStoryBoard的标头有

@availability(iOS, introduced=5.0)
class UIStoryboard : NSObject {
    init(name: String, bundle storyboardBundleOrNil: NSBundle?) -> UIStoryboard

    func instantiateInitialViewController() -> AnyObject
    func instantiateViewControllerWithIdentifier(identifier: String) -> AnyObject!
}

这里没有convenience关键字。但是请说这是一个方便的初始化程序。然后,这应该工作:

class CharacterStoryboard: UIStoryboard {        
    convenience override init() {
        self.init(name: "SomeName", bundle: nil);
    }
}

但这会产生错误“调用中的额外参数'name'”,好像该初始化程序根本不存在。

我发现的唯一解决方法是执行以下操作:

class CharacterStoryboard: UIStoryboard {
    convenience init(name: String, bundle storyboardBundleOrNil: NSBundle?) {
        self.init(name: name, bundle: storyboardBundleOrNil)
    }

    convenience override init() {
        self.init(name: "SomeName", bundle: nil);
    }
}

这只是Swift中的错误,还是我缺少重要的东西?

更新

正如我早先已经发现的那样,这段代码在运行时会创建一个无限循环。

我认为这绝对是Swift的错误,我应该注意一下。

rick

是的,几乎可以肯定这是一个错误。与Apple一起提交文件可能是一个好主意

某些ObjC API的怪异情况是仅将它们的工厂方法作为“排序”初始化程序导入到Swift中。您可以看到这种情况,UIStoryboard因为init(...)签名具有返回类型:

init(name: String, bundle storyboardBundleOrNil: NSBundle?) -> UIStoryboard
                                                            ^^^^^^^^^^^^^^^

您无法init在自己的Swift代码中声明带有返回类型的,这只是ObjC到Swift导入程序的构件。并且当您有一个这样导入的类时,您会陷入无法编写init调用指定的初始化器的子类的情况(因为据Swift所知,没有指定的初始化器),并且您无法调用要么是工厂方法。所以,听起来像个虫子

请注意,即使此问题得到解决,您可能仍然需要重写,init(name:bundle:)然后才能从自己的方法调用它convenience init()我希望此类的正确Swift API具有一个失败的初始化程序(因为您可以指定磁盘上不存在的名称或捆绑软件)。如果你想实现一个非失败init()的failable而言init?(...),你必须通过一个委托的两倍init!(...)因为看到这个答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++零初始化-为什么此程序中的`b`未初始化,而`a`已初始化?

来自分类Dev

用于SKPhysicsBody的Swift便捷初始化程序扩展

来自分类Dev

为什么要在Swift中为struct编写初始化程序才能在单元测试中使用它?

来自分类Dev

便捷初始化

来自分类Dev

Swift 初始化程序

来自分类Dev

Swift初始化程序中的错误

来自分类Dev

是否可以在Objective-C中调用Swift便捷初始化程序

来自分类Dev

是否可以使用便捷初始化程序覆盖指定的初始化程序?

来自分类Dev

Swift为什么不强迫我指定的初始化程序调用super?

来自分类Dev

用作自己的初始化程序的未初始化变量的行为是什么?

来自分类Dev

为什么我在Swift中得到这个“无法构建,因为它没有可访问的初始化程序”

来自分类Dev

我的 C# 程序没有按照我认为的对象初始化顺序初始化对象。为什么?

来自分类Dev

必须指定Swift协议中的初始化程序。为什么?

来自分类Dev

为什么我们不能迅速在扩展中添加指定的初始化程序?

来自分类Dev

为什么我的self.init不自动填充到便利初始化程序中?

来自分类Dev

无法理解为什么无法初始化对象初始化程序中的数组初始化程序

来自分类Dev

在便捷初始化Swift 3中获取类名

来自分类Dev

在Swift子类中添加便捷初始化器

来自分类Java

数组不应由数组初始化程序静态初始化。为什么?

来自分类Dev

斯威夫特:为什么初始化?(长度长度:整数)NSMutableData的初始化程序失败了吗?

来自分类Dev

为什么只有自动实现的属性才能在C#中具有初始化程序?

来自分类Dev

为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

来自分类Dev

Swift:便捷初始化程序-在self.init调用之前使用的Self

来自分类Dev

在调用self.init之前使用的iOS Swift便捷初始化程序self

来自分类Dev

Swift 3:便捷初始化程序扩展了Foundation的“ Timer”挂起

来自分类Dev

为什么std :: function的初始化程序必须是CopyConstructible的?

来自分类Dev

为什么String(_:radix :)初始化程序起作用?

来自分类Dev

如何在Swift中为子类重写初始化程序

来自分类Dev

为什么此嵌套对象初始化程序引发空引用异常?

Related 相关文章

  1. 1

    C ++零初始化-为什么此程序中的`b`未初始化,而`a`已初始化?

  2. 2

    用于SKPhysicsBody的Swift便捷初始化程序扩展

  3. 3

    为什么要在Swift中为struct编写初始化程序才能在单元测试中使用它?

  4. 4

    便捷初始化

  5. 5

    Swift 初始化程序

  6. 6

    Swift初始化程序中的错误

  7. 7

    是否可以在Objective-C中调用Swift便捷初始化程序

  8. 8

    是否可以使用便捷初始化程序覆盖指定的初始化程序?

  9. 9

    Swift为什么不强迫我指定的初始化程序调用super?

  10. 10

    用作自己的初始化程序的未初始化变量的行为是什么?

  11. 11

    为什么我在Swift中得到这个“无法构建,因为它没有可访问的初始化程序”

  12. 12

    我的 C# 程序没有按照我认为的对象初始化顺序初始化对象。为什么?

  13. 13

    必须指定Swift协议中的初始化程序。为什么?

  14. 14

    为什么我们不能迅速在扩展中添加指定的初始化程序?

  15. 15

    为什么我的self.init不自动填充到便利初始化程序中?

  16. 16

    无法理解为什么无法初始化对象初始化程序中的数组初始化程序

  17. 17

    在便捷初始化Swift 3中获取类名

  18. 18

    在Swift子类中添加便捷初始化器

  19. 19

    数组不应由数组初始化程序静态初始化。为什么?

  20. 20

    斯威夫特:为什么初始化?(长度长度:整数)NSMutableData的初始化程序失败了吗?

  21. 21

    为什么只有自动实现的属性才能在C#中具有初始化程序?

  22. 22

    为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

  23. 23

    Swift:便捷初始化程序-在self.init调用之前使用的Self

  24. 24

    在调用self.init之前使用的iOS Swift便捷初始化程序self

  25. 25

    Swift 3:便捷初始化程序扩展了Foundation的“ Timer”挂起

  26. 26

    为什么std :: function的初始化程序必须是CopyConstructible的?

  27. 27

    为什么String(_:radix :)初始化程序起作用?

  28. 28

    如何在Swift中为子类重写初始化程序

  29. 29

    为什么此嵌套对象初始化程序引发空引用异常?

热门标签

归档