在阅读同事的代码时,不同人对对象的初始化方式是不一样的,例如存在一个对象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() 语法。