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
 
}