swift 中,对象() 和 对象.init() 的共同点和异同点

在阅读同事的代码时,不同人对对象的初始化方式是不一样的,例如存在一个对象AController,

有些人创建的方式如下:

swift 复制代码
let controller = AController()

也有人创建的方式如下:

swift 复制代码
let controller = AController.init()

下面来说明一下,这两种方式的异同行:

1. 基本等价性

在多数情况下,以上两种写法是完全等价的,这两个代码都会调用 AController 的默认初始化方法来创建一个新实例。

2. 语法糖

AController() 实际上是 AController.init()的语法糖,swift编辑器会将AController()转换对init方法的调用。

3. 特殊情况下的区别
  • 当类名与函数名冲突时:
    当存在一个局部变量或者函数的名称与类名相同,使用 .init() 可以明确指出你是在调用初始化方法:
swift 复制代码
func AController() -> String {
  return "this is the AController method"
}

let instance =  AController() // 调用函数
let realInstance = AController.init() //创建类实例
  • 在泛型或协议上下文中,当使用泛型或者协议类型时,.init()语法可能更清晰或必要。
swift 复制代码
protocol SomeProtocol {
	init()
}

func createInstance<T : SomeProtocol>() -> T {
	return T.init()
}
  • 自定义运算符
    如果类名与自定义运算符冲突,使用 .init() 可以避免歧义。
4. 可读性和风格
  • AController() 更简洁,是大多数 Swift 开发者的首选语法。
  • AController.init() 更明确,在某些情况下可以提高代码的可读性,特别是当你想强调正在调用初始化方法时。
5. 编译器优化

在某些情况下,编译器可能会对 AController() 语法进行更好的优化,但这种差异通常是微不足道的。

6. 多个初始化方法

当一个类有多个初始化方法时,两种语法都可以用于调用特定的初始化方法:

swift 复制代码
class AController {
  init() {}
  init(parameter : Int) {}
}

let controller1 = AController(parameter:5)
let controller2 = AController.init(parameter:5)

总结:

在绝大多数情况下,AController() 和 AController.init() 是完全等价的。选择使用哪种语法主要取决于个人或团队的编码风格,以及特定的上下文需求。通常推荐使用更简洁的 AController(),除非在特殊情况下需要更明确的 .init() 语法。

相关推荐
IT知识分享几秒前
数字上标、下标如何打,6种常用方法详解
开发语言·c#·xhtml
qwert10376 分钟前
深入解析Python标识符:定义、规则、规范与实践指南
开发语言·数据库·python
号码认证服务11 分钟前
给用户打电话,怎么在对方手机显示为“XX证券”?号码认证办理步骤
android·运维·服务器·ios·智能手机·iphone·webview
MonkeyKing13 分钟前
iOS 启动优化实战:pre-main耗时、二进制重排与动态库裁剪全解析
ios
cqwuliu13 分钟前
Freemarker模板工具
java·开发语言
学习,学习,在学习13 分钟前
Qt多线程的使用与注意事项
开发语言·数据库·qt
MonkeyKing14 分钟前
iOS 卡顿优化实战:离屏渲染、混合图层与圆角优化全解析
ios
asdfg125896314 分钟前
`(line1, line2) -> line1 + line2` 此Lambda 表达式的理解
java·开发语言
如竟没有火炬16 分钟前
去除重复字母——贪心+单调栈
开发语言·数据结构·python·算法·leetcode·深度优先
AI人工智能+电脑小能手25 分钟前
【大白话说Java面试题 第49题】【JVM篇】第9题:什么是双亲委派机制?介绍一下运作过程。?
java·开发语言·jvm