您知道使用Swift编程语言阻止对象构建的方法有哪些?
在C++中,我可以简单地将构造函数设为私有,如下所示:
struct A {
private:
A() {};
};
int main()
{
// Doesn't compile because the constructor is private.
A obj;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在Swift中做类似的事情(我在游乐场尝试过)时,代码编译得很好:
class A {
private init() {}
}
let obj = A()
Run Code Online (Sandbox Code Playgroud)
更新:
好的,这个问题被标记为重复.但我认为这是一种误解.我要问的是,你知道什么是防止Swift中的对象构建的最佳实践.我想要达到的目的是让我的班级用户明白它不应该是可构造的.
更新2:
由于这个问题仍然存在,我认为,对于那些仍然无法理解我真正想要的人,需要更多的澄清.
给定一个类作为一些有用常量的包装器,如下所示:
class Constants {
static let someConstant1 = "CONSTANT_VALUE1"
static let someConstant2 = "CONSTANT_VALUE2"
//....etc...
}
Run Code Online (Sandbox Code Playgroud)
什么选项可以被视为最佳实践:
private init() {}以防止在当前文件之外创建对象;init?和返回nil表示不能按照注释中的建议创建对象.希望现在的问题更清楚了.
从Apple的Swift指南:
专用访问将实体的使用限制在其自己的定义源文件中.使用私有访问隐藏特定功能的实现细节.
您的游乐场文件都是一个文件,因此不会强制执行隐私.
例如,如果您创建一个新项目并将名为Dog.swift的文件添加到项目中,如下所示:
import Foundation
class Dog {
private init() {
print("hello")
}
}
class Cat {
var d = Dog()
}
Run Code Online (Sandbox Code Playgroud)
在ViewController.swift中,您可以编写:
override func viewDidLoad() {
let c = Cat() //=>hello
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你尝试:
override func viewDidLoad() {
let d = Dog()
}
Run Code Online (Sandbox Code Playgroud)
在编译程序之前,Xcode会将其标记为错误:
'狗'无法构建,因为它没有可访问的初始化器
回复评论:
class A {
init?() {
return nil
}
func greet() {
print("hello")
}
}
let x = A()
if let x = x {
x.greet()
}
else {
print("nice try") //=> nice try
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3565 次 |
| 最近记录: |