Swift associatedType的值是否可以是协议?
associatedtype的值是否可以是协议Swift associatedType的值是否可以是协议?,swift,generics,swift-protocols,Swift,Generics,Swift Protocols,associatedtype的值是否可以是协议 protocol A { var name: String {get set} } protocol B: A {} protocol C { associatedtype T: B var t : T {get set} } class D : C { var t : B init(t : B) { self.t = t } } class E : B { var
protocol A {
var name: String {get set}
}
protocol B: A {}
protocol C {
associatedtype T: B
var t : T {get set}
}
class D : C {
var t : B
init(t : B) {
self.t = t
}
}
class E : B {
var name: String = ""
}
class F : B {
var name: String = "ff"
}
在D类中,如果t的类型是E或F,则代码将编译。但如果t的类型是B(这是一个协议),编译失败,说明:
类型“D”不符合协议“C”
如何使关联类型保存协议值?有什么能说明它失败的原因吗
更新的问题
删除associatedtype上的绑定并仅使用T不会有帮助。我的协议也有我想要访问的方法。例如:
protocol A {
func sayHello()
}
protocol B : A {
var name: String {get set}
}
extension B {
func sayHello() {
print("Hello")
}
}
protocol C {
associatedtype T
var t: T {get set}
}
class D : C {
typealias T = E
var t: T
init(t : T) {
self.t = t
}
}
class E : B {
var name: String = ""
}
class F : B {
var name: String = "ff"
}
class G<S: C> {
var a: S
init(a: S) {
self.a = a
}
func notWorking() {
a.t.sayHello()
}
}
协议A{
func sayHello()
}
B议定书:A{
变量名称:字符串{get set}
}
分机B{
func sayHello(){
打印(“你好”)
}
}
方案C{
关联T型
var t:t{get set}
}
D类:C类{
类型别名T=E
变量t:t
初始(t:t){
self.t=t
}
}
E类:B类{
变量名称:String=“”
}
F类:B类{
变量名称:String=“ff”
}
G类{
变量a:S
初始化(a:S){
self.a=a
}
func notWorking(){
a、 t.sayHello()
}
}
在上面的示例中,我无法访问sayHello方法。
任何符合C的东西都必须实现关联类型T
。但是,未定义类型。因此,符合协议的类或结构必须隐式或显式地定义它
首先,让我们创建一个符合C的类SomeClass。我们必须定义t
。那么,您可以根据与t
关联的值来定义t
class D : C {
typealias T = B
var t: B
init(t : B) {
self.t = t
}
}
更新
您已经创建了Tassociatedtype
,意味着分配一个动态通用类型值,在这种情况下,T
值已经分配。为什么要创建associatedtype,您可以直接使用。像
protocol C {
//associatedtype T: B
//var t : T {get set}
var t: B {get set} // write directly.
}
–
B
不是符合B
的类型,因此不能满足关联类型associatedtype T:B
。在上述实现中,我们基本上是在定义associatedtype时删除上限。但这意味着我们不能访问协议中定义的任何方法。@Sajani查看我更新的答案
protocol C {
//associatedtype T: B
//var t : T {get set}
var t: B {get set} // write directly.
}