gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:35:52 31 4
gpt4 key购买 nike

我正在尝试定义一个符合 Equatable 的测试夹具,以便我可以验证采用协议(protocol)的函数是否按预期执行。我尝试了 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 声明上都遇到了编译器错误:

Declaration is only valid at file scope

好的,所以我想我不应该在嵌套定义上实现扩展。所以我将只实现初始声明中的所有协议(protocol):

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
}
}

现在我得到了编译器错误

Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements

所以我的问题是:当我在结构的初始声明中实现它时,为什么编译器只提示 Equatable 具有关联的类型要求?为什么我不能在嵌套类型中定义扩展?我只是想了解为什么编译器会做这些事情。


为了提供更多上下文,我在这里尝试测试的是类是否正确地将 MyProtocol 对象附加到数组:

class MyClass {
var elements: [MyProtocol] {
return _elements
}
private var _elements: [MyProtocol] = []
func add(_ element: MyProtocol) {
// I'm testing this function
}
}

最佳答案

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

已打开一个问题:SR-3092 .

关于swift - 为什么我只能在扩展中实现 Equatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330809/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com