我试图定义一个符合Equatable
的测试工具,以便我可以验证一个协议按预期执行的功能。我尝试了3种不同的排列。
import XCTest
import MyProtocol
struct TestFixture {
let identifier: String
init(identifier: String) {
self.identifier = identifier
}
}
extension TestFixture: MyProtocol {
func myProtocolFunc() {}
}
extension TestFixture: Equatable {
static func ==(lhs: TestFixture, rhs: TestFixture) {
return lhs.identifier == rhs.identifier
}
}
class TestCase: XCTestCase {
func testSomething() {
// do something that requires a MyProtocol object
}
}
这很好用。但是,我想将TestFixture
转换为嵌套定义,所以我试试这个:
import XCTest
import MyProtocol
class TestCase: XCTestCase {
func testSomething() {
struct TestFixture {
let identifier: String
init(identifier: String) {
self.identifier = identifier
}
}
extension TestFixture: MyProtocol {
func myProtocolFunc() {}
}
extension TestFixture: Equatable {
static func ==(lhs: TestFixture, rhs: TestFixture) {
return lhs.identifier == rhs.identifier
}
}
// do something that requires a MyProtocol object
}
}
此时,我在两个extension
声明中都遇到编译器错误:
声明仅在文件范围内有效
好的,我想我不应该在嵌套定义上实现扩展。所以我只是在初始声明中实现所有协议:
import XCTest
import MyProtocol
class TestCase: XCTestCase {
func testSomething() {
struct TestFixture: MyProtocol, Equatable {
let identifier: String
init(identifier: String) {
self.identifier = identifier
}
func myProtocolFunc() {}
static func ==(lhs: TestFixture, rhs: TestFixture) {
return lhs.identifier == rhs.identifier
}
}
// do something that requires a MyProtocol object
}
}
现在我收到了编译错误
协议' Equatable'只能用作通用约束,因为它具有Self或关联类型要求
所以我的问题是:当我在结构的初始声明中实现它时,为什么编译器只抱怨Equatable
具有关联的类型要求?为什么我不能在嵌套类型中定义扩展?我只是想了解为什么编译器正在做这些事情。
为了提供更多的上下文,我在这里尝试测试的是一个类正确地将MyProtocol
对象附加到数组:
class MyClass {
var elements: [MyProtocol] {
return _elements
}
private var _elements: [MyProtocol] = []
func add(_ element: MyProtocol) {
// I'm testing this function
}
}