当前位置: 首页 > news >正文

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

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

let controller = AController()

也有人创建的方式如下:

let controller = AController.init()

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

1. 基本等价性

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

2. 语法糖

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

3. 特殊情况下的区别
  • 当类名与函数名冲突时:
    当存在一个局部变量或者函数的名称与类名相同,使用 .init() 可以明确指出你是在调用初始化方法:
func AController() -> String {return "this is the AController method"
}let instance =  AController() // 调用函数
let realInstance = AController.init() //创建类实例
  • 在泛型或协议上下文中,当使用泛型或者协议类型时,.init()语法可能更清晰或必要。
protocol SomeProtocol {init()
}func createInstance<T : SomeProtocol>() -> T {return T.init()
}
  • 自定义运算符
    如果类名与自定义运算符冲突,使用 .init() 可以避免歧义。
4. 可读性和风格
  • AController() 更简洁,是大多数 Swift 开发者的首选语法。
  • AController.init() 更明确,在某些情况下可以提高代码的可读性,特别是当你想强调正在调用初始化方法时。
5. 编译器优化

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

6. 多个初始化方法

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

class AController {init() {}init(parameter : Int) {}
}let controller1 = AController(parameter:5)
let controller2 = AController.init(parameter:5)

总结:

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

http://www.lryc.cn/news/419171.html

相关文章:

  • Google安装JSON-handle扩展
  • 剖析算法内部结构----------贪心算法
  • uni-app开发微信小程序注意事项,不要用element-ui
  • Hibernate的检索策略(lazy、fetch、batch-size)
  • 算法训练(leetcode)第四十六天 | 110. 字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长
  • 自定义Mybatis-Plus分布式ID生成器(解决ID长度超过JavaScript整数安全范围问题)
  • 2024剪辑神器盘点:四大热门剪辑软件推荐!
  • sql注入靶场sqli-labs常见sql注入漏洞详解
  • [C++] 模板进阶:特化与编译链接全解析
  • oracle-备份
  • oracle 并行parallel的插入insert用法
  • 夜莺监控使用指南
  • MySQLDM笔记-查询库中是否存在列出的表名及查询库中列出的不存在的表名
  • 第9天 xxl-job
  • C++字符串<string>库
  • 智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用
  • 02 Canal的安装使用
  • 【网络安全】玲珑安全第四期
  • 【工具】图片背景移除界面 UI 源码
  • CentOS linux 安装openssl(openssl拒绝服务漏洞【CVE-2022-0778】解决)
  • 假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中?
  • flutter doctor出现 Unable to find bundled Java version
  • Linux系统修改root密码
  • AI时代,我们还可以做什么?
  • 【生成式人工智能-十-文字、图片、声音生成策略】
  • git pull 注意事项
  • 拥抱变革:旗晟智能巡检机器人系统重塑高风险行业巡检模式
  • 监听器——监听着我们WEB项目中的域对象
  • cs使用说明
  • skynet 连接redis