在运行时,Swift 如何知道要使用哪个实现?

2023-11-24

protocol A {
    func f()
}

struct S1 : A {
    func f() {
        print("S1")
    }
}

struct S2 : A {
    func f() {
        print("S2")
    }
}

let array: [A] = [S1(), S2()]

for s: A in array {
    s.f()
}

// "S1\n" "S2\n"

如果这是一个继承层次结构,我希望 Swift 使用 v-table 来查找正确的实现。然而,具体类型array可以是任何实现A,以及许多其他协议,那么如果 Swift 运行时也使用 v-tables,它如何知道对象的结构呢?


Swift 运行时使用协议见证表,其中保存指向协议方法的每种类型的实现的指针。

迈克·阿什(Mike Ash)在他的文章中对此做了最好的解释探索 Swift 内存布局,第二部分:

最后一个位于偏移量 32 处,是基础类型和协议的“协议见证表”,其中包含指向协议方法的类型实现的指针。这就是编译器能够在运行时不知道底层类型的情况下对协议类型的值调用方法(例如 p())的方式。

我也会观看 WWDC 视频了解 Swift 性能正如哈米什评论中所建议的。

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

在运行时,Swift 如何知道要使用哪个实现? 的相关文章

  • 将数字分解为单个数字的数组

    如果我有整数 123 并且我想将数字分解为数组 1 2 3 最好的方法是什么 我已经搞乱了很多 并且我有以下工作 var number 123 var digits Array String number map Int strtoul S
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • Swift 中通过不同类调用委托方法

    我正在获取 JSON 菜单 一旦 JSON 返回 我想运行 menuReady 来更新表的内容在 SomeTableViewController 类中 但下面的代码似乎不起作用 AIM Run 菜单就绪 JSON 返回后更新内容 PROBL
  • Firestore 读取包含子集合的文档的计费

    我正在制作一个应用程序 它存储用户使用我的应用程序学习了多少分钟 我的 Firestore 数据库以 用户 集合开始 每个用户都有自己的文档 该文档由其在 Auth 中生成的 userID 命名 我的问题是 如果我读取了他们的 userID
  • 删除 UINavigationBar 下的 1px 边框 - 不起作用

    IBOutlet var navBar UINavigationBar self navBar setBackgroundImage UIImage forBarMetrics UIBarMetrics Default self navBa
  • Swift 中的字典是否应该转换为类或结构?

    我正在开发一个本机 iOS 应用程序 该应用程序从我们也可以控制的 Web 服务接收 JSON 格式的数据 该计划是在大约 18 个月内更换后端数据库 以支持不同的平台 考虑到这一点 我们希望确保 iOS 应用程序能够相对容易地适应新的数据
  • WKWebView:无需 Javascript 即可缩放PageToFit 行为

    如何获得scalesPageToFit显示在 HTML 内容中的行为WKWebView 不使用 JavaScript 在我们的例子中需要禁用 JS 抱歉没有发布任何代码 但我不知道如何实现这一目标 我所知道的和我找到的所有解决方案都是基于J
  • Swift 在调试和发布模式下的行为不同

    不确定这是否是 Swift XCode 或 Alamofire 的问题 但我认识到我的混合 Swift Objc 应用程序中不同地方的奇怪行为 它只发生在用 Swift 编写并使用闭包 网络的部分 这是发生这种情况的示例代码 Alamofi
  • 快速重写函数错误

    我有一个结构 struct ErrorResultType ErrorType var description String var code Int 和一个协议 protocol XProtocol func dealError erro
  • Swift 语言中的抽象函数

    我想用 swift 语言创建一个抽象函数 是否可以 class BaseClass func abstractFunction How do I force this function to be overridden class SubC
  • 如何使用 swift 在 UITabBarController 中以编程方式添加选项卡?

    如何以编程方式从 UIViewController 扩展的任何类创建选项卡 class DashboardTabBarController UITabBarController override func viewDidLoad here
  • 当前图像选择模式会擦除 UI

    我下面有一个非常简单的视图控制器 UI 实际上只是一个带有底部标签栏的按钮 import UIKit class ImageAdderViewController UIViewController override func viewDid
  • 如何跟踪 SwiftUI 应用程序中的所有触摸

    我正在尝试在 SwiftUI 应用程序中实现锁屏 我需要跟踪每个事件才能重新启动锁定计时器 在 UIKit 应用程序中 我使用了这种方法 重写 UIApplication 它允许了解应用程序中的任何事件 override func send
  • 带有自定义 init 的 SwiftUI 视图

    假设我正在制作一个如下所示的自定义输入元素 struct CustomInput View Binding var text String var name String var body some View TextField name
  • Swift 中的 @autoreleasepool 相当于什么?

    在 Swift 中 我注意到没有 autoreleasepool 构造 尽管 Swift 确实使用了 ARC 在 Swift 中管理自动释放池的正确方法是什么 或者它是否因某种原因被删除 语法如下 autoreleasepool code
  • 在 Safari 中快速打开链接

    我目前正在我的应用程序中打开链接WebView 但我正在寻找一个打开链接的选项Safari反而 它不是 融入 Swift 但你可以使用标准UIKit方法来做到这一点 看看 UIApplication 的openUrl https devel
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • UNTimeIntervalNotificationTrigger nextTriggerDate() 是否给出了错误的日期?

    我正在更新本地通知以与 iOS 10 配合使用 但遇到了一个问题 我认为 nextTrigger 函数返回的不是 满足触发条件的下一个日期 而是返回当前日期时间加上您最初设置 UNTimeInvervalNotificationTrigge
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代

随机推荐

  • Gradle 无法解析 Android Studio 中的库

    我想在 Android Studio 中包含一个库 但它显示如下错误 无法解析 com lemonlab expandable button menu 1 0 0 如何解决这个问题 apply plugin com android appl
  • 带有模板参数的 C++0x lambda? [复制]

    这个问题在这里已经有答案了 可能的重复 lambda 函数可以模板化吗 是否可以使用带有模板参数的 c 0x lambda 例如 template
  • 为 Linux 安装 Anaconda [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试安装适用于 Linux 的 Anaconda Linux Mint 17 2 Rafaela 14 04 3 LTS Trusty Tahr 我看到一条警告 警告 机器似乎
  • 如果我的 url 包含路由参数,则哈希链接会以角度重新路由

    如果我有一个一级路由 那么哈希链接将按预期工作 无需重新路由 但是 我有一些国家 kh 的网址 如果我尝试使用诸如国家 kh projects 之类的哈希标签 页面会重新路由 这非常烦人 因此 如果我在页面国家 地区并单击链接 develo
  • 如果没有连续的内存空间,realloc 会做什么?

    realloc用于动态重新分配内存 假设我已经使用分配了 7 个字节malloc函数 现在我想将其扩展到 30 个字节 如果内存中没有30字节的连续 单行连续 空间 后台会发生什么 是否有任何错误或者内存是否会被分段分配 realloc幕后
  • MS Visual Studio 2010如何使用.asm生成的文件

    我想询问一些我想尝试使用 Visual Studio 2010 的事情 我通过在项目属性 gt C C gt 输出文件 FAs 中将选项设置为 汇编器输出 从 cpp 文件生成 asm 文件 我的问题是 下一步如何使用 asm 生成的文件从
  • 子类 UITableViewCell 中的 UIButton 需要调用父类的方法

    很抱歉 如果答案已经存在 但我找不到 我有以下设置 MainViewController 它有一个大的 UITableView 和 CustomTableViewCell 它是 UITableViewCell 的子类 CustomTable
  • 无法创建多可用区 Aurora RDS 实例

    当我恢复 MySQL 快照时 我可以选择将新实例设置为多可用区 但是 由于某种原因 当我恢复到 Aurora 时 多可用区部署 选择被禁用 我想这可能意味着它会自动启用 但是 当我转到正在运行的实例详细信息时 它特别列出了多可用区 否 我有
  • 检查核心数据中是否设置了属性?

    如何检查核心数据对象中是否设置了属性 我将所有核心数据对象加载到目录中 var formQuestions Questions 我的核心数据 NSManagementObject 是 NSManaged var noticeText Str
  • 如何在 this.props.children 中访问 React 对象的类名

    在一个 React 组件渲染方法中 在 this props children 中有一些子组件 如何获取每个子组件的组件 类 名称以区分它们 React Children map this props children function c
  • 将 .DLL 转换为 .SO

    你们中的任何人都可以帮我将 Windows dll 文件转换为 so 文件吗 您可以尝试将 dll 的源代码重新编译为共享对象 This在确保代码确实可移植后 可能会帮助您入门 Edit Here is 还有另一个链接它可以帮助指导您完成使
  • Xcode 正在 OS X 对象而不是 iOS 对象中加载

    我有一个 iOS 窗口应用程序 直到今天它都可以与 Xcode 正常运行 当我在对象库中打开项目时 它似乎加载了所有 OS X 开发对象 并且我再也看不到任何可可触摸项目 如 UITextViews 等 我没有手动更改任何设置 所以我不确定
  • 如何更改现有表以在 Oracle 中创建范围分区

    我现有的表包含 10 年的数据 我已转储 我想在表中的一个日期键列上对现有表进行范围分区 我看到的大多数例子都是CREATE TABLE PARTITION BY RANGE 添加新分区 但我的表是现有的表 我想我需要一些ALTER陈述 A
  • 如何在 C++ 中声明原子向量

    我打算声明一个原子变量向量 用作多线程程序中的计数器 这是我尝试过的 include
  • 在曲线边缘绘制箭头

    灵感来自这个问题在 Ask sagemath 什么是best将箭头添加到生成的曲线末尾的方法Plot ContourPlot ETC 这些是高中时看到的绘图类型 表明曲线从页面末尾继续延伸 经过一番搜索 我找不到内置的方法或最新的包来执行此
  • std::launder 如何影响容器?

    考虑以下固定大小向量的简化且不完整的实现 template
  • Find() 与 FirstOrDefault() 的性能[重复]

    这个问题在这里已经有答案了 类似问题 Find 与Where FirstOrDefault 在具有单个字符串属性的简单引用类型的大序列中搜索 Diana 得到了一个有趣的结果 using System using System Collec
  • Alamofire:[结果]:失败:错误域=NSURLErrorDomain代码=-999“已取消”

    我正在连接的服务使用自签名证书 出于开发目的 我不想验证该链 将 swift 3 与 Alamofire 4 结合使用 相应地修复了 ATS
  • 从文件中删除所有以 # 开头的行

    文件中所有带有注释的行都以 如何删除以以下内容开头的所有行 并且仅删除那些行 其他行包含 但不在行开头的应被忽略 这可以通过sed 单行 sed d 这表示 找到所有以 开头的行并将其删除 保留其他所有内容
  • 在运行时,Swift 如何知道要使用哪个实现?

    protocol A func f struct S1 A func f print S1 struct S2 A func f print S2 let array A S1 S2 for s A in array s f S1 n S2