Swift 泛型:通过将泛型参数限制为由所述协议定义的变量类型来遵守协议
Swift Generics: Conforming to protocol by constraining generic parameters to variable types defined by said protocol
在我的域模块中,我定义了协议 Assignment、TimeLog 和 AssignmentTimeLog。
在定义具体实现时,我想使用泛型来符合 AssignmentTimeLog 协议。为此,我将通用 A、T 参数限制为 Domain.Assignment 和 Domain.TimeLog 类型。为什么这不满足协议要求?我想了解发生的事情的逻辑。
// Domain Module
public protocol AssignmentTimeLog {
var assignment: Assignment { get }
var timeLog: TimeLog { get }
}
// My attempt to create an implementation trows an error
// Error:
// Type 'AssignmentTimeLog<A, T>' does not conform to protocol 'AssignmentTimeLog'
import Domain
struct AssignmentTimeLog<A, T>:
Domain.AssignmentTimeLog where A: Domain.Assignment, T: Domain.TimeLog {
var assignment: A
var timeLog: T
}
对于上下文:使用泛型的原因是稍后我想在 AssignmentTimeLog 上定义一个扩展,其中 A & T 还实现了另一个协议。这提供了额外的功能而无需额外的代码。具体类型实现域协议以及那些附加协议。
我试图通过阅读文档和多个博客来弄清楚这一点。但我似乎无法准确地 issue/gap 了解我的理解。
协议与您的实现所说的不同。
事实 1
根据协议,这 getter
var assignment: Assignment { get }
可以return任何符合Assignment
.
的值
事实 2
另一方面,您在此处的实施
var assignment: A
表示 assignment
将包含特定类型 A
的值(恰好符合 Assignment
)。
这是两种截然不同的说法。
修复
这是一个简单的解决方法
protocol AssignmentTimeLog {
associatedtype A: Assignment
associatedtype B: TimeLog
var assignment: A { get }
var timeLog: B { get }
}
struct MyAssignmentTimeLog<A, T>: AssignmentTimeLog where A: Assignment, T: TimeLog {
var assignment: A
var timeLog: T
}
在我的域模块中,我定义了协议 Assignment、TimeLog 和 AssignmentTimeLog。
在定义具体实现时,我想使用泛型来符合 AssignmentTimeLog 协议。为此,我将通用 A、T 参数限制为 Domain.Assignment 和 Domain.TimeLog 类型。为什么这不满足协议要求?我想了解发生的事情的逻辑。
// Domain Module
public protocol AssignmentTimeLog {
var assignment: Assignment { get }
var timeLog: TimeLog { get }
}
// My attempt to create an implementation trows an error
// Error:
// Type 'AssignmentTimeLog<A, T>' does not conform to protocol 'AssignmentTimeLog'
import Domain
struct AssignmentTimeLog<A, T>:
Domain.AssignmentTimeLog where A: Domain.Assignment, T: Domain.TimeLog {
var assignment: A
var timeLog: T
}
对于上下文:使用泛型的原因是稍后我想在 AssignmentTimeLog 上定义一个扩展,其中 A & T 还实现了另一个协议。这提供了额外的功能而无需额外的代码。具体类型实现域协议以及那些附加协议。
我试图通过阅读文档和多个博客来弄清楚这一点。但我似乎无法准确地 issue/gap 了解我的理解。
协议与您的实现所说的不同。
事实 1
根据协议,这 getter
var assignment: Assignment { get }
可以return任何符合Assignment
.
事实 2
另一方面,您在此处的实施
var assignment: A
表示 assignment
将包含特定类型 A
的值(恰好符合 Assignment
)。
这是两种截然不同的说法。
修复
这是一个简单的解决方法
protocol AssignmentTimeLog {
associatedtype A: Assignment
associatedtype B: TimeLog
var assignment: A { get }
var timeLog: B { get }
}
struct MyAssignmentTimeLog<A, T>: AssignmentTimeLog where A: Assignment, T: TimeLog {
var assignment: A
var timeLog: T
}