- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是我在主要目标中的代码(所以不是测试目标):
protocol ProtocolA {
func dontCrash()
}
extension ProtocolA {
func dontCrash() {
fatalError()
}
func tryCrash() {
dontCrash()
}
}
class MyClass: ProtocolA {}
在我的测试目标(如此不同的目标)中,我得到了这段代码:
import XCTest
@testable import Project
extension MyClass {
func dontCrash() {
print("I dont crash")
}
}
class ProjectTests: XCTestCase {
func testExample() {
MyClass().tryCrash()
}
}
它崩溃了。为什么不使用动态调度机制呢? MyClass
有它自己的 dontCrash()
实现,我希望它能触发。
最佳答案
您的 Project
模块声明 MyClass
符合 ProtocolA
。
Swift 使用称为“协议(protocol)见证表”的数据结构来实现这种一致性。对于协议(protocol)声明的每个方法,见证表包含一个函数,该函数调用符合类型的方法的实际实现。
具体来说,MyClass
与ProtocolA
的一致性有一个witness table。该见证表包含 ProtocolA
声明的 dontCrash
方法的函数。 witness 表中的该函数调用 MyClass
dontCrash
方法。
当您的测试用例遇到 fatalError
时,您可以在堆栈跟踪中看到协议(protocol)见证表中的函数:
#8 0x00000001003ab9d9 in _assertionFailure(_:_:file:line:flags:) ()
#9 0x00000001000016fc in ProtocolA.dontCrash() at /Users/rmayoff/TestProjects/Project/Project/AppDelegate.swift:11
#10 0x0000000100001868 in protocol witness for ProtocolA.dontCrash() in conformance MyClass ()
#11 0x000000010000171e in ProtocolA.tryCrash() at /Users/rmayoff/TestProjects/Project/Project/AppDelegate.swift:15
#12 0x00000001030f1987 in ProjectTests.testExample() at /Users/rmayoff/TestProjects/Project/ProjectTests/ProjectTests.swift:12
#13 0x00000001030f19c4 in @objc ProjectTests.testExample() ()
第 10 帧是 tryCrash
对协议(protocol)见证表中函数的调用。帧 #9 是从协议(protocol)见证表函数到 dontCrash
实际实现的调用。
Swift 在声明一致性的模块中发出协议(protocol)见证表。因此,在您的情况下,见证表是 Project
模块的一部分。
您在测试包中覆盖 dontCrash
不能更改见证表的内容。为时已晚。当 Swift 生成 Project
模块时,witness 表被完全定义。
这就是为什么它必须是这样的:
假设我是 Project
模块的作者,而您只是它的用户。当我编写 Project
模块时,我知道调用 MyClass().dontCrash()
会调用 fatalError
,我依赖于此行为。在 Project
的许多地方,我特别调用了 MyClass().dontCrash()
,因为我知道它会调用 fatalError
。作为 Project
的用户,您不知道 Project
在多大程度上依赖于该行为。
现在您在您的应用中使用了 Project
模块,但您追溯更改了 MyClass().dontCrash()
以不调用 fatalError
。现在所有那些 Project
调用 MyClass().dontCrash()
的地方都没有按照我编写 Project
时预期的方式运行模块。您已经破坏了 Project
模块,即使您没有更改 Project
模块或 Project
导入的任何模块的源代码.
这对 Project
模块的正确操作至关重要。因此,更改 MyClass().dontCrash()
含义的唯一方法(当从 Project
模块内部调用时)是更改 Project 的源代码
模块本身(或更改 Project
导入的东西的源代码)。
关于swift - 动态调度协议(protocol)扩展不适用于多个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487613/
我有一个带有一些功能的perl对象。每个功能从主程序中调用一次。我想并行运行某些功能以节省时间。由于某些功能取决于先前功能的结果,因此我无法将它们全部一起运行。 我想到了这样的事情: 对于每个函数,保
首先,我的代码在这里: import schedule # see https://github.com/dbader/schedule import crawler def job(): p
从 11 月 1 日开始,我必须使用quartz调度程序每4个月安排一次任务。我使用 cronExpression 来实现同样的目的。但 cronExpression 每年都会重置。所以我的任务将在
我有以下代码块,它调用两个请求,但略有延迟。 final ActorRef actor1 = getContext().actorOf( ActorClass.prop
考虑到 Linux 的情况,我们为每个用户堆栈都有一个内核堆栈,据我所知,每当发生上下文切换时,我们都会切换到当前进程的内核模式。 这里我们保存当前进程的当前状态,寄存器,程序数据等,然后调度器(不确
我有将东西移植到 OpenBSD 的奇怪爱好。我知道它有 pthreads 问题,但在 2013 年 5 月发布版本之前我不会升级。我使用的是 5.0,我对 pthreads 还很陌生。我已经学习了
给定一组任务: T1(20,100) T2(30,250) T3(100,400) (execution time, deadline=peroid) 现在我想将截止日期限制为 Di = f * Pi
使用 Django 开发一个小型日程安排 Web 应用程序,在该应用程序中,人们被分配特定的时间与他们的上级会面。员工存储为模型,与表示时间范围和他们有空的星期几的模型具有 OneToMany 关系。
我想了解贪婪算法调度问题的工作原理。 所以我一直在阅读和谷歌搜索一段时间,因为我无法理解贪心算法调度问题。 我们有 n 个作业要安排在单个资源上。作业 (i) 有一个请求的开始时间 s(i) 和结束时
这是流行的 El Goog 问题的变体。 考虑以下调度问题:有 n 个作业,i = 1..n。有 1 台 super 计算机和无限的 PC。每个作业都需要先经过 super 计算机的预处理,然后再在P
假设我有一个需要运行多次的蜘蛛 class My_spider(Scrapy.spider): #spider def 我想做这样的事 while True: runner = Cra
我已将 podAntiAffinity 添加到我的 DeploymentConfig 模板中。 但是,pod 被安排在我预计会被规则排除的节点上。 我如何查看 kubernetes 调度程序的日志以了
我已经使用 React - Redux - Typescript 堆栈有一段时间了,到目前为止我很喜欢它。但是,由于我对 Redux 很陌生,所以我一直在想这个特定的话题。 调度 Redux 操作(和
我想按照预定的计划(例如,周一至周五,美国东部时间晚上 9 点至 5 点)运行单个 Azure 实例以减少账单,并且想知道最好的方法是什么。 问题的两个部分: 能否使用服务管理 API [1] 按预定
假设最小模块安装(为了简单起见),Drupal 的 index.php 中两个顶级功能的核心“职责”是什么? ? drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); me
我正在尝试使用 Racket(以前称为 PLT Scheme)连接 URL 调度。我查看了教程和服务器文档。我不知道如何将请求路由到相同的 servlet。 具体例子: #lang 方案 (需要网络服
我想在 Airflow (v1.9.0) 上运行计划。 我的DAG需要在每个月底运行,但我不知道如何编写设置。 my_dag = DAG(dag_id=DAG_ID, cat
我正在尝试在“httpTrigger”类型函数的 function.json 中设置计划字段,但计时器功能似乎未运行。我的目标是拥有一个甚至可以在需要时进行调度和手动启动的功能,而不必仅为了调度而添加
我正在尝试制定每周、每月的 Airflow 计划,但不起作用。有人可以报告可能发生的情况吗?如果我每周、每月进行安排,它就会保持静止,就好像它被关闭一样。没有错误信息,只是不执行。我发送了一个代码示例
我希望每两周自动更新一次我的表格。我希望我的函数能够被 firebase 调用。 这可能吗? 我正在使用 Angular 2 Typescript 和 Firebase。 最佳答案 仅通过fireba
我是一名优秀的程序员,十分优秀!