首页 > 解决方案 > 如何在 Swift 中使用初始化器或构造器

问题描述

我一直对 Swift 的基本原理有疑问。当我编码时,我经常花太多时间在类中使用变量和常量。我认为我挣扎的原因是因为我植根于 Java 中,几乎所有东西都是在构造函数中创建的,所以Class myVar = new Class()我真的很熟悉,但在 Swift 中,我看到了两者:

let userClient = UserClient()
let userService: UserService
...
init(userService: UserService) {
  self.userService = userService
}

在我看来,这有点像跨多个类传递一些东西?

在创建该类或结构的实例时,类和结构必须将其所有存储的属性设置为适当的初始值。存储的属性不能处于不确定状态。

我明白这一点。伟大的。但是为什么我们不总是只声明像let iNeedThisFunctionality = Functionality().

抱歉,如果这个想法真的很基本,我可以创建复杂的 UI 和用户身份验证等等,这让我很恼火,但我一直在这个问题上绊倒。我有点只是依靠 xcode 来告诉我我声明了一些错误。

谢谢!

标签: iosswiftclassmobileinitialization

解决方案


我植根于 Java 中,几乎所有东西都是在构造函数中创建的

如果需要,您可以在初始化程序中执行所有操作:

class Foo {
    let userClient: UserClient
    let userService: UserService

    init(userService: UserService) {
        self.userService = userService
        self.userClient = UserClient()
    }
}

只是 的 初始化userClient不依赖于任何初始化参数,或者self,所以可以内联完成:

let userClient = UserClient()

但是为什么我们不总是声明像这样的东西let iNeedThisFunctionality = Functionality()呢?

您不能userService以这种方式初始化,因为它需要初始化为 initialiser 参数。即当你创建一个Foo

let foo = Foo(userService: someService)

foo.userService需要someService。的设计Foo要求创建 a Foo,您需要将 a 传递UserService给它,并且它的userService属性将被初始化为该服务。

如果您“扎根于 Java”,那么您也应该在 Java 中看到过这种代码:

public class Foo {
    private final UserClient userClient = new UserClient();
    private final UserService userService;

    public Foo(UserService userService) {
        this.userService = userService;
    }
}

这就是我将您的 Swift 代码翻译成 Java 的方式。你也可以做“两者”。


推荐阅读