【问题标题】:Swift protocol conformance with associated type using same-type constraint使用相同类型约束的关联类型的 Swift 协议一致性
【发布时间】:2017-12-19 08:34:17
【问题描述】:

我正在尝试定义一个扩展协议 A 的协议 B(后者包含关联的类型 C),同时使用编译器建议的具有相同类型约束的 where 子句。但是,这样做时,代码将不再编译。这是一个 Swift 错误吗(在这种情况下是 Swift 4)?

更具体地说,下面的代码编译时不会出错:

类型“E”不符合协议“A”

class D {

}

protocol A: class {
    associatedtype C: AnyObject
}

protocol B: A where C == D {

}

class E: B {

}

如下所示更改协议 B 的定义将编译但会显示此警告:

从协议“A”覆盖关联类型“C”的类型别名更好地表示为协议上的相同类型约束

protocol B: A {
    typealias C = D
}

让它在没有警告的情况下编译的唯一方法是在类 E 中指定类型别名并使用协议 B 中的 where 子句,但这似乎重复了不必要的类型别名:

protocol B: A where C == D {

}

class E: B {
    typealias C = D
}

【问题讨论】:

    标签: swift swift4


    【解决方案1】:

    我猜想协议声明的相同类型约束在符合该协议时不会被类读取。

    为避免类型别名的重复,您可以从协议 B 中删除相同的类型约束,并使用扩展名在协议 B 上赋予类型别名。

    class D {
    
    }
    
    protocol A: class {
        associatedtype C
    }
    
    protocol B: A  {
    }
    
    extension B {
        typealias C = D
    }
    
    class E: B  {
    }
    

    【讨论】:

    • 谢谢!这种解决方法似乎可以解决它。但是,我仍然认为这是一个错误,并在 Swift 问题跟踪器中提交了一个问题。
    • 你知道这个错误是被优先处理的还是被修复的?我想我也面临同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多