何时在Swift中继承NSObject

时间:2015-02-15 05:14:03

标签: ios objective-c swift

我刚刚开始阅读有关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继承子类?

1 个答案:

答案 0 :(得分:2)

正如matt的评论中所述,你的问题不是NSObject的问题。在swift中,如果你愿意,有三个访问级别。私有,模块内和公共。如果你没有装饰属性,方法,类等...默认是在模块内。这意味着它可以被同一个目标中的任何内容访问。因为您在测试中运行代码(具有不同的目标),您只能访问明确公开的内容。

您的课程是公开的,您可以将其导入。但是,您免费获得的默认初始化是默认值。因此,在目标之外,测试无法访问init。 NSObjects init显然是Public,所以当你从它中继承时,你得到了一个Public init。

我会引用NSObject Class Reference来看看你从中继承它时给你的东西。我的感觉是,在很多情况下,它不是必需的,特别是如果你没有与很多Objective C进行互操作。

然后导致问题,我需要一个类,还是应该使用结构?