我刚刚开始阅读有关Swift的内容。曾经几年前在这里和那里做过Objective-c我有一个愚蠢的问题。在Swift中你应该或不应该继承NSObject吗?那里有关于它的最佳实践吗?
在操场上,我可以这样做:
public class Printer {
public func SaySomething(s : String) {
print(s);
}
}
var pr = Printer()
pr.SaySomething("yo");
这一切都按预期工作。但是,我以为我会通过创建一个Cocoa Touch Framework来快速练习。所以我创建了Printer.swift,复制并粘贴了上面看到的类。然后在TestLibraryTests文件中我尝试实例化一台打印机。所以我做了
var p : Printer = Printer()
我收到错误Printer cannot be constructed because it has no accessible initializers.
所以我添加了init() {}
。
public class Printer {
init() {}
public func SaySomething(s : String) {
print(s);
}
}
仍然没有建立。我得到了同样的错误。然后,一旦我说打印机是NSObject的子类,一切都有效。这是为什么?有没有时间你不应该从NSObject继承子类?
答案 0 :(得分:2)
正如matt的评论中所述,你的问题不是NSObject的问题。在swift中,如果你愿意,有三个访问级别。私有,模块内和公共。如果你没有装饰属性,方法,类等...默认是在模块内。这意味着它可以被同一个目标中的任何内容访问。因为您在测试中运行代码(具有不同的目标),您只能访问明确公开的内容。
您的课程是公开的,您可以将其导入。但是,您免费获得的默认初始化是默认值。因此,在目标之外,测试无法访问init。 NSObjects init显然是Public,所以当你从它中继承时,你得到了一个Public init。
我会引用NSObject Class Reference来看看你从中继承它时给你的东西。我的感觉是,在很多情况下,它不是必需的,特别是如果你没有与很多Objective C进行互操作。
然后导致问题,我需要一个类,还是应该使用结构?