Swift 通用协议属性声明

Swift 通用协议属性声明,swift,Swift,假设我有一个关联类型为T的协议 protocol Helper{ associatedtype T func help(_ item: T) } 在类中,我要声明一个属性 class Manager<T>{ let item: T? let helper: Helper<T> //Error: Cannot specialize non-generic type 'Helper' let anotherHelper: Helpe

假设我有一个关联类型为T的协议

protocol Helper{
    associatedtype T
    func help(_ item: T)
}
在类中,我要声明一个属性

class Manager<T>{
    let item: T?
    let helper: Helper<T>
//Error: Cannot specialize non-generic type 'Helper'

    let anotherHelper: Helper 
//Error: Protocol 'Helper' can only be used as a generic constraint because it has Self or associated type requirements
}
类管理器{
让项目:T?
让助手:助手
//错误:无法专门化非泛型类型“Helper”
让另一个助手:Helper
//错误:协议“Helper”只能用作泛型约束,因为它具有自身或关联的类型要求
}
如何声明和使用helper属性,使其强制符合helper协议的类的类型


我敢肯定,很多有Java/C或其他类似语言背景的人在尝试做类似事情时会陷入困境

在这种情况下,你可以让
Manager
中的
T
成为
助手

class Manager<T> where T : Helper {
    let item: T.T?
    let helper: T

    init(helper: T) {
        self.helper = helper
        item = nil
    }
}

然后使用
Manager

您可能需要一个类型擦除器:

struct AnyHelper:Helper{
私人出租帮助函数:(T)->Void
init(helper:H),其中helper.T==T{
helpFunc=helper.help
}
函数帮助(uu项:T)
helpFunc(项目)
}
}
然后在课堂上使用类型橡皮擦:

类管理器{
让项目:T?
让助手:AnyHelper
init(item:T,helper:H),其中H.T==T{
self.item=项目
self.helper=AnyHelper(helper)
}
}

尽管这似乎解决了这个特殊情况,但它并没有回答这个问题。通常T是一个模型,助手是在模型上执行操作的消费者。执行此操作的代码是什么样子的?
class IntHelper : Helper {
    typealias T = Int

     // ... 
}