Swift:协议、结构、类

2024-05-16

我开始学习 Swift 语言,但在理解协议、结构和类方面遇到了困难。

我来自 Android 方面的编程,所以我相信 Swift 协议基本上是 Java 接口?

其中每一个的正确用例是什么?


这些类比并不“完全”正确,但这就是我所理解的要点

  1. 是的,协议实际上就像接口一样

  2. 类就是类,就像 Java/Android 以及几乎任何其他语言中的类一样

  3. 结构类似于类,但当它们从一个变量/函数传递到另一个变量/函数时,它们是按值传递(复制)的。 如果您完全熟悉 C#,它的结构实现非常相似。

Eg:

class Foo {
   ...
}

let x = Foo()
let z = x 

此时x和z在内存中都引用同一个Object,只有一个Foo object

struct Bar {
   ...
}

let a = Bar()
let b = a 

当分配 b 时,a 被复制(想想基本上复制内存块)。此时,有两个独立的Bar内存中的对象,修改一个对象不会影响另一个对象。

为什么这有用?有时您不需要共享引用,但主要是出于性能原因。因为结构体不必全部引用同一个对象,所以它们不必在堆上分配。相反,它们通常可以分配在堆栈上,即much快点。此外,结构数组可以实现为一大块连续的内存,这意味着如果您想遍历所有结构,它对 CPU 缓存会更加友好。

Swift 不会进行垃圾收集,但对于像 C# 这样的垃圾收集语言来说,这可能意味着垃圾收集器不必处理大量本来可能需要处理的对象。即使在快速结构复制也意味着它可以避免这样做Retain/ReleaseARC 所需的幕后工作,这可以提供很大帮助。

结构体的主要用例是当您有大量不可变的“简单数据”,例如 Vector(3 个浮点值的集合)时

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift:协议、结构、类 的相关文章

随机推荐

  • Java EE6> 将 JSF Facelets (xhtml) 和 ManagedBeans 打包为 JAR

    是否可以将 JSF Facelets 和 ManagedBeans 打包到 JAR 文件中 这样我们就可以在不同的 war ear 项目中使用这个代码和 UI 组合了吗 我不是在谈论 JSF 组件 如果是的话 你能给我指一下教程或博客文章吗
  • java.lang.VerifyError:JVMVRFY012堆栈形状不一致;

    在 WAS 8 5 5 中部署 Maven 项目时出现以下错误 我在WAS中安装了JDK 1 6和1 7 错误500 org springframework web util NestedServletException 处理程序处理失败
  • 验证美国的电话号码是否存在

    我想用 C 验证美国的给定电话号码 是否有任何API或其他东西可以帮助程序员验证电话号码存在 我不仅想验证它们是否与美国电话号码的格式匹配 还想验证它们的存在 提前致谢 您可以使用正则表达式验证电话号码格式 例如 但为了验证该电话号码是否确
  • 使用 BGTaskScheduler 进行后台获取与调试模拟完美配合,但在实践中却不起作用

    我在 appDelegate 的 didFinishLaunchingWithOptions 中注册后台获取任务 BGTaskScheduler shared register forTaskWithIdentifier Backgroun
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • C++ 中求幂的函数是什么?

    如何计算一个数的幂 2 1 2 2 2 3 etc cmath 库中的 pow 更多信息here http en cppreference com w cpp numeric math pow 别忘了放 include
  • 需要使用 iFrame API 隐藏 YouTube 品牌

    我正在使用 YouTube iFrame API 在我的自定义播放器 javascript 播放器 中加载视频 我需要隐藏 Youtube 品牌 但是在 iOS 设备上 它显示带有以下参数的徽标 playerVars fs 1 autopl
  • 游戏GUI框架

    我目前正在重新修改游戏的用户界面 OpenLieroX http www openlierox net即 我正在寻找一个可以轻松创建 GUI 的库 框架 具体来说 这是我的要求 开源 游戏是 LGPL 的 遇到许可问题是我们最不想关心的事情
  • Google reCAPTCHA v2 在幕后如何工作?

    本文引用的是 Google ReCaptcha v2 不是最新版本 最近谷歌推出了简化的 验证码 验证系统 video https www youtube com watch v jwslDn3ImM0 使用户只需单击即可通过 验证码 但它
  • 如何从 Internet Explorer 获取与 cookie 关联的过期日期和标志?

    我可以得到 cookie 的值互联网获取Cookie http msdn microsoft com en us library windows desktop aa384710 28v vs 85 29 aspx or InternetG
  • SQL Server 大小写/排序规则问题

    今天我在客户数据库中遇到了一个奇怪的情况 SQL Server 2005 数据库排序规则不区分大小写 因此我可以使用任何大小写编写 SQL 查询 没有任何问题 除了一个 一张特定表中的一个特定列称为 DeadZone 如果我这样查询 从表名
  • 使用 zip 实用程序从工作区目录中压缩多个文件/文件夹

    我们有一个 Jenkins 管道 我想压缩位于工作区中多个目录中的多个文件 py 和 cfg 有没有一种方法可以将多个值传递给dirzip 方法的选项 zip zipFile package zip dir WORKSPACE infra
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • 以有效的方式在循环中附加字符串

    很长一段时间 我总是按以下方式附加字符串 例如 如果我想获取用某个符号分隔的所有员工姓名 在下面的示例中我选择了管道符号 字符串最终 字符串 Empty foreach Employee emp in EmployeeList final
  • 通过纯 JavaScript 获取 div 的第 n 个子元素

    我有一个名为 myDiv 的 div 元素 我怎样才能得到 myDiv 的第n个孩子DOM https en wikipedia org wiki Document Object Model操纵 Markup function reveal
  • SVG 文本无法在 Chrome 或 Safari 中呈现

    我有一些 SVG 文本在 Firefox 上运行良好 但在 Chrome 和 Safari 中却没有出现 我努力了 向 svg 容器添加填充 以防文本被隔断 从文本中删除 xml space preserve 添加内联填充颜色
  • 在 C# 中使用“C”dll [重复]

    这个问题在这里已经有答案了 可能的重复 如何从 C ASP NET 网页调用非托管 C C 代码 https stackoverflow com questions 720004 how do i call unmanaged c c co
  • Chrome 扩展程序可以相互通信吗?

    我正在编写一个Chrome扩展程序 并且想要实现一个接口或api 以便我将来制作的其他扩展程序可以使用它 最终的效果可能如下 分机 B 呼叫extensionA someMethod someParameters 并向分机A发送一些数据 分
  • AOSP 中 android.Build.SERIAL 何时何地生成?

    我知道android Build SERIAL是在第一次设备启动时生成的 但我无法准确定位位置和时间 我正在建造AOSP Jelly Bean Android平板电脑 nosdcard 第二个问题 这个是序列号吗 really对所有人来说都
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的