Swift public class 的初始值设定项
Swift initializer for public class
创建publicclass时,是否需要指定初始化器public?
成功与否有什么区别?public
例如
public class A {
init() {}
}
或
public class A {
public init() {}
}
您不需要将其设置为 public,除非您将其设置为可在 Objective-C 中使用的框架。
参见:https://developer.apple.com/swift/blog/?id=5
When mixing Objective-C and Swift, because the generated header for a
framework is part of the framework’s public Objective-C interface,
only declarations marked public appear in the generated header for a
Swift framework.
没有
您不需要做到 public。事实上,您可以将其设为私有。指定初始化程序(并且您的 class 允许多个)唯一的特殊之处在于它们负责确保对象被完全初始化。
便利初始化器(一个初始化器要么是指定的要么是方便的)(由convenience
关键字标记)没有这个责任。便利初始化器首先委托给指定初始化器,然后returns,它有机会覆盖一些初始值。重要的是,便利初始化器必须始终“委托”。它必须始终在 class.
中调用另一个初始化程序
相比之下,指定初始化器(任何未标记 convenience
关键字的初始化器)必须负责确保 class 中的每个 属性 都获得有效的初始值,然后它必须“向上委托”(调用超级 class 初始化程序,如果有超级 class),然后它可以根据需要覆盖值。
但是没有什么能阻止你创建一个 class 只用私有指定的初始值设定项(什么都没有)。
即使我们从带有 required
初始化器的 class 继承,我们的 subclass 也可以简单地将该初始化器实现为方便的初始化器。
class ParentClass {
let foo: Int
required init(foo: Int) {
self.foo = foo
}
}
class ChildClass: ParentClass {
let bar: Int
private init(foo: Int, bar: Int) {
self.bar = bar
super.init(foo: foo)
}
required convenience init(foo: Int) {
self.init(foo: foo, bar: foo)
}
}
以上完全有效Swift。
ChildClass
有一个私有的指定初始化器。它从父 class 继承了一个必需的初始化器,但它将该初始化器实现为一个方便的初始化器。 (此外,与您在此处的评论和其他问题中的猜想相反, required
初始值设定项实际上不一定是 public
......上下文很重要,也许我会扩展这是对你其他问题的回答。)
此外,与 形成鲜明对比的是,您无需编写 Swift 代码的一部分 public
即可使用 Objective-C 中的代码,而他在回答中引用的来自 Apple 的文章实际上表明了这一点。您只需标记 public 您希望在已实现代码的 框架 之外可用的内容。您 可以 将 Objective-C 和 Swift 代码放在同一应用程序中,并且 Objective-C 代码可以看到任何标记为 public
或 internal
.
创建publicclass时,是否需要指定初始化器public?
成功与否有什么区别?public
例如
public class A {
init() {}
}
或
public class A {
public init() {}
}
您不需要将其设置为 public,除非您将其设置为可在 Objective-C 中使用的框架。
参见:https://developer.apple.com/swift/blog/?id=5
When mixing Objective-C and Swift, because the generated header for a framework is part of the framework’s public Objective-C interface, only declarations marked public appear in the generated header for a Swift framework.
没有
您不需要做到 public。事实上,您可以将其设为私有。指定初始化程序(并且您的 class 允许多个)唯一的特殊之处在于它们负责确保对象被完全初始化。
便利初始化器(一个初始化器要么是指定的要么是方便的)(由convenience
关键字标记)没有这个责任。便利初始化器首先委托给指定初始化器,然后returns,它有机会覆盖一些初始值。重要的是,便利初始化器必须始终“委托”。它必须始终在 class.
相比之下,指定初始化器(任何未标记 convenience
关键字的初始化器)必须负责确保 class 中的每个 属性 都获得有效的初始值,然后它必须“向上委托”(调用超级 class 初始化程序,如果有超级 class),然后它可以根据需要覆盖值。
但是没有什么能阻止你创建一个 class 只用私有指定的初始值设定项(什么都没有)。
即使我们从带有 required
初始化器的 class 继承,我们的 subclass 也可以简单地将该初始化器实现为方便的初始化器。
class ParentClass {
let foo: Int
required init(foo: Int) {
self.foo = foo
}
}
class ChildClass: ParentClass {
let bar: Int
private init(foo: Int, bar: Int) {
self.bar = bar
super.init(foo: foo)
}
required convenience init(foo: Int) {
self.init(foo: foo, bar: foo)
}
}
以上完全有效Swift。
ChildClass
有一个私有的指定初始化器。它从父 class 继承了一个必需的初始化器,但它将该初始化器实现为一个方便的初始化器。 (此外,与您在此处的评论和其他问题中的猜想相反, required
初始值设定项实际上不一定是 public
......上下文很重要,也许我会扩展这是对你其他问题的回答。)
此外,与 public
即可使用 Objective-C 中的代码,而他在回答中引用的来自 Apple 的文章实际上表明了这一点。您只需标记 public 您希望在已实现代码的 框架 之外可用的内容。您 可以 将 Objective-C 和 Swift 代码放在同一应用程序中,并且 Objective-C 代码可以看到任何标记为 public
或 internal
.