将 associatedtype 限制为数组

Restriction on associatedtype to an Array

我有一个带有关联类型的协议,我让我的一些 类 符合它:

protocol MyProtocol {
    associatedtype MyType
    func myFunction()-> MyType
}

struct MyStruct: Codable {
    var myVar: Int
}

class MyClass1: MyProtocol {
    func myFunction()-> [MyStruct]? {
        return [MyStruct(myVar: 1)]
    }
}

class MyClass2: MyProtocol {
    func myFunction()-> Int? {
        return 1
    }
}

现在我想创建一个只能应用于符合 MyProtocol 的对象的协议,其关联类型是 数组Codable 像这样:

protocol MyProtocolCodable where Self: MyProtocol, MyType: [Codable] {} 

但是我得到一个错误:

Type 'Self.MyType' constrained to non-protocol, non-class type '[Codable]' (aka 'Array<Decodable & Encodable>')

我怎样才能解决这个问题并应用我的限制?


注意:我在尝试限制任何类型的数组时遇到同样的错误,但对其他类型的数组工作正常:

protocol MyProtocolCodable where Self: MyProtocol, MyType: [Int] {} 
protocol MyProtocolCodable where Self: MyProtocol, MyType: Array<Any> {} 

这是因为Array不是一个协议,它是一个结构:

@frozen struct Array<Element>

您可以尝试符合 Sequence 而不是:

protocol MyProtocolCodable where Self: MyProtocol, MyType: Sequence, MyType.Element: Codable {}

您应该使用“==”来进行关联类型约束,替换您的而不是:

protocol MyProtocolCodable where Self: MyProtocol, MyType == [Codable] {}