如何防止Swift中的对象构造

Sta*_*ots 6 ios swift

您知道使用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表示不能按照注释中的建议创建对象.

希望现在的问题更清楚了.

7st*_*tud 5

从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)