【问题标题】:When to subclass NSObject in Swift何时在 Swift 中继承 NSObject
【发布时间】:2015-02-15 05:14:03
【问题描述】:

我刚开始阅读有关 Swift 的信息。几年前曾经在这里和那里做objective-c,我有一个愚蠢的问题。在 Swift 中,你应该或不应该继承 NSObject 吗?有没有关于它的最佳实践?

在操场上,我可以这样做:

public class Printer {
    public func SaySomething(s : String) {
        print(s);
    }
}

var pr = Printer()
pr.SaySomething("yo");

这一切都按预期工作。但是,我认为我可以通过创建 Cocoa Touch 框架来快速练习。因此,我创建了 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 子类化?

【问题讨论】:

  • 打印语法是 println() 而不是 print(),试试吧!
  • 不需要 NSObject。只需说 public init() {}。

标签: ios objective-c swift


【解决方案1】:

正如 matt 的评论中所述,您的问题不是 NSObject 之一。如果您愿意,很快就会有三个访问级别。私有、模块内和公共。如果不装饰属性、方法、类等……默认是模块内。这意味着同一目标中的任何东西都可以访问它。由于您在测试中运行代码(具有不同的目标),因此您只能访问明确公开的内容。

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

我会参考NSObject Class Reference,看看当您从它继承时它会给您带来什么。我的感觉是,在很多情况下,它不是必需的,特别是如果您不与很多 Objective C 进行互操作。

这就引出了一个问题,我需要一个类,还是应该使用一个结构?

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2019-09-20
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多