为什么我只能在扩展中实现Equatable

时间:2016-10-30 15:48:57

标签: swift swift-protocols

我试图定义一个符合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
    }
}

1 个答案:

答案 0 :(得分:0)

这似乎是Swift编译器的一个错误。当前的解决方案是在函数范围之外声明结构。

问题已经打开:SR-3092