Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift associatedType的值是否可以是协议?_Swift_Generics_Swift Protocols - Fatal编程技术网

Swift 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

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 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
    }
}
更新

您已经创建了T
associatedtype
,意味着分配一个动态通用类型值,在这种情况下,
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.
}