ios - 如何在 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
以这种方式初始化,因为它需要初始化为 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 的方式。你也可以做“两者”。
推荐阅读
- java - 给定一个创建新实例的图像阅读器,我可以将格式指定为 RAW12 或任何类型的 RAW 并将其转换为 png 图像吗?
- html - 为什么尽管是 ap 标签,但线路没有中断?
- typescript - 继续生成 ID,直到它在数据库中不存在
- apache - 将所有子域 URL 重定向到匹配的主域 URL - 重定向页面路径不起作用
- python - 如何替换熊猫数据框中某个字符的所有实例
- javascript - 使用 Javascript 将 HTML 表单中的 2 个输入相乘
- postgresql - 在 postgres 中为 time 生成系列结果的正确方法
- python - 如何颜色对齐可视化?
- javascript - 如何制作一个调用 setUserContext 的可重用函数?React Hooks 使用上下文
- javascript - 我想添加新任务并对其进行编辑。当我尝试更新 1 个任务时,之前单击编辑图标的所有任务都将得到更新。为什么这样?