将 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] {}
我有一个带有关联类型的协议,我让我的一些 类 符合它:
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] {}