swift中的默认初始化程序

run*_*ios 20 swift

我用字符串选项(String?)创建了一个swift类,并在不同的swift文件中实例化了这个类,并得到了编译错误.当我在同一个文件中实例化该类时,没有错误.我在做什么不对劲?我仔细检查了行为,即使使用swift文档中给出的类定义,这种行为也是一致的:

class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false
}
var item = ShoppingListItem()
Run Code Online (Sandbox Code Playgroud)

摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/in/jEUH0.l

如果var item = ShoppingListItem()在做appDelegate.swift,从功能上application:didFinishLaunchingWithOptions我们得到的错误:

<class> cannot be initialised because it has no accessible initializers
Run Code Online (Sandbox Code Playgroud)

OTOH,如果我们在类声明结束后立即保持实例化,就没有问题.

编辑:此问题不是showstopper,当前的默认初始化行为似乎不一致或我需要更好地理解它

Hig*_*asy 32

有可能是Swift编译器和访问控制的问题(不指向手指,只是尝试进行故障排除).向类中添加显式初始值设定项,看看是否有效:

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

    init() { }
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,则将类与初始化程序一起设置为public

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

        public init() { }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这不是编译器问题.所有纯Swift类(没有父类)都需要至少一个初始化程序(或其所有成员的初始值,包括Optionals).Apple的文档并没有很好地解释这一点. (2认同)

zrs*_*slv 17

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

var name: String? = nil
Run Code Online (Sandbox Code Playgroud)

修复错误.

  • 它修复了错误,但是快速书正在说"如果你定义一个可选的常量或变量而不提供默认值,那么常量或变量会自动设置为nil:".那么,为什么我们需要明确提供nil? (4认同)