- 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/
我在我的 Xcode 项目目录中输入了以下内容: keytool -genkey -v -keystore release.keystore -alias mykey -keyalg RSA \
假设我有一个像这样的 DataFrame(或 Series): Value 0 0.5 1 0.8 2 -0.2 3 None 4 None 5 None
我正在对一个 Pandas 系列进行相对繁重的应用。有什么方法可以返回一些打印反馈,说明每次调用函数时在函数内部进行打印还有多远? 最佳答案 您可以使用跟踪器包装您的函数。以下两个示例,一个基于完成的
我有一个 DataFrame,其中一列包含列表作为单元格内容,如下所示: import pandas as pd df = pd.DataFrame({ 'col_lists': [[1, 2
我想使用 Pandas df.apply 但仅限于某些行 作为一个例子,我想做这样的事情,但我的实际问题有点复杂: import pandas as pd import math z = pd.Dat
我有以下 Pandas 数据框 id dist ds 0 0 0 0 5 1 0 0 7 2 0 0
这发生在我尝试使用 Gradle 构建时。由于字符串是对象,因此似乎没有理由发生此错误: No signature of method: java.util.HashMap.getOrDefault(
您好,有人可以解释为什么在 remaining() 函数中的 Backbone 示例应用程序 ( http://backbonejs.org/examples/todos/index.html ) 中
我有两个域类:用户 class User { String username String password String email Date dateCreated
问题陈述: 一个 pandas dataframe 列系列,same_group 需要根据两个现有列 row 和 col 的值从 bool 值创建。如果两个值在字典 memberships 中具有相似
apporable 报告以下错误: error: unknown type name 'MKMapItem'; did you mean 'MKMapView'? MKMapItem* destina
我有一个带有地址列的大型 DataFrame: data addr 0 0.617964 IN,Krishnagiri,635115 1 0.635428 IN,Chennai
我有一个列表list,里面有这样的项目 ElementA: Number=1, Version=1 ElementB: Number=1, Version=2 ElementC: Number=1,
我正在编译我的源代码,它只是在没有运行应用程序的情况下终止。这是我得到的日志: Build/android-armeabi-debug/com.app4u.portaldorugby/PortalDo
我正在尝试根据另一个单元格的值更改单元格值(颜色“红色”或“绿色”)。我运行以下命令: df.loc[0, 'Colour'] = df.loc[0, 'Count'].apply(lambda x:
我想弄清楚如何使用 StateT结合两个 State基于对我的 Scalaz state monad examples 的评论的状态转换器回答。 看来我已经很接近了,但是在尝试申请 sequence
如果我已经为它绑定(bind)了集合,我该如何添加 RibbonLibrary 默认的快速访问项容器。当我从 UI 添加快速访问工具项时,它会抛出 Operation is not valid whi
在我学习期间Typoclassopedia我遇到了这个证明,但我不确定我的证明是否正确。问题是: One might imagine a variant of the interchange law
我是一名优秀的程序员,十分优秀!