我一直在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
需要是someService
。Foo
的设计要求,要创建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