如何在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来告诉我我宣布了一些错误。

谢谢!

我植根于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,因为它需要初始化为initializer参数。即当您创建Foo:时

let foo = Foo(userService: someService)

foo.userService需要是someServiceFoo的设计要求,要创建Foo,您需要将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的方式。你可以做";两个";也

这与它是存储属性还是计算属性有关。有关详细信息,请参阅此文档:https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

最新更新