【问题标题】:Default Initializer in swiftswift中的默认初始化器
【发布时间】:2014-08-15 13:22:29
【问题描述】:

我创建了一个带有可选字符串(String?)的 swift 类,并在另一个 swift 文件中实例化了该类,但出现了编译错误。当我在同一个文件中实例化类时,没有错误。我做错了什么吗?我仔细检查了该行为,即使与 swift 文档中给出的类定义也是一致的:

class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false
}
var item = ShoppingListItem()

摘自:Apple Inc.“Swift 编程语言”。电子书。 https://itun.es/in/jEUH0.l

如果var item = ShoppingListItem()appDelegate.swift 中完成,则从函数application:didFinishLaunchingWithOptions 我们得到错误:

<class> cannot be initialised because it has no accessible initializers

OTOH,如果我们在类声明一结束就保持实例化,就没有问题。

编辑:这个问题不是什么大问题,当前的默认初始化程序行为似乎不一致,或者我需要更好地理解它

【问题讨论】:

  • 请发布您的错误
  • 另外在你使用类的地方添加一些上下文,我不确定我是否理解这个问题。
  • 你添加init(){}了吗?
  • @PseudoNym01 出现编译错误: 无法初始化,因为它没有可访问的初始化程序。
  • @HighFlyingFantasy 我创建了一个新的 swift 文件,其中包含我的模型,在其中我创建了一个类(以上面的代码作为示例类)。然后我在 appDelegate - applicationdidFinishLaunchingWithOptions 中实例化了这个类。这样做会产生编译错误,即上述错误。

标签: swift


【解决方案1】:

这可能是 Swift 编译器和访问控制的问题(不是指手画脚,只是试图排除故障)。为类添加一个显式初始化器,看看它是否有效:

class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false

    init() { }
}

如果这不起作用,则将类设置为公共,以及初始化器

    public class ShoppingListItem {
        var name: String?
        var quantity = 1
        var purchased = false

        public init() { }
    }

【讨论】:

  • 是的,添加显式 init() 确实有效,这就是我所做的,问题的关键是我想确定这是编译器的问题。从到目前为止的回复来看,这似乎是一个编译器问题。如果没有其他矛盾的回答,我会将其标记为答案。
  • 这不是编译器问题。所有纯 Swift 类(没有父类的类)都需要至少一个初始化程序(或所有成员的初始值,包括 Optionals)。 Apple 的文档没有很好地解释这一点。
  • 我正在 Playground 中使用它,结果发现我还需要公开类、init 和变量才能访问它们。感谢您对此的帮助。
  • 为什么 Playground 要求初始化器是公开的,而以 NSObject 作为父级的子类层次结构却不需要?
【解决方案2】:

为所有成员提供默认值,在这种情况下

var name: String? = nil

修正错误。

【讨论】:

  • 刚刚发现一样
  • 它修复了错误,但 swift book 说“如果你定义一个可选的常量或变量而不提供默认值,常量或变量会自动为你设置为 nil:”。那么,为什么这里需要明确地提供 nil 呢?
  • 没有做出改变
猜你喜欢
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
相关资源
最近更新 更多