Swift 为什么采用ProtocolB的ClassA不满足ProtocolB要求

Swift 为什么采用ProtocolB的ClassA不满足ProtocolB要求,swift,Swift,我创建了下面的游乐场代码,以说明我在当前项目中遇到的困难。有人能帮我理解最后一行的编译器错误吗 import Foundation //****************************************************************************** // This Compiles //********************************************************

我创建了下面的游乐场代码,以说明我在当前项目中遇到的困难。有人能帮我理解最后一行的编译器错误吗

import Foundation

//******************************************************************************
//                            This Compiles
//******************************************************************************

protocol Protocol1 : AnyObject {
    var related: [Protocol2] { get set }
}

protocol Protocol2 : AnyObject {
    var related: [Protocol1] { get set }
}

class Class1 : Protocol1 {
    var related = [Protocol2]()
}

class Class2 : Protocol2 {
    var related = [Protocol1]()
}

let class1 = Class1()
let class2 = Class2()
class2.related.append(class1)


//******************************************************************************
//                            This Does Not Compile
//******************************************************************************

class Weak<T: AnyObject> {
    weak var reference : T?
    init (_ reference: T) {
        self.reference = reference
    }
}

protocol ProtocolA : AnyObject {
    var related: [Weak<ProtocolB>] { get set }
}

protocol ProtocolB : AnyObject {
    var related: [Weak<ProtocolA>] { get set }
}

class ClassA : ProtocolA {
    var related = [Weak<ProtocolB>]()
}

class ClassB : ProtocolB {
    var related = [Weak<ProtocolA>]()
}

let classA = ClassA()
let classB = ClassB()
classA.related.append(Weak(classB)) // <= Cannot convert value of type 'Weak<ClassB>' to expected argument type 'Weak<ProtocolB>'
<代码>导入基础 //****************************************************************************** //这就编译了 //****************************************************************************** 协议协议1:任何对象{ 变量相关:[Protocol2]{get set} } 协议协议2:任何对象{ 变量相关:[Protocol1]{get set} } 类别1:协议1{ 变量相关=[Protocol2]() } 类别2:协议2{ 变量相关=[Protocol1]() } 设class1=class1() 设class2=class2() class2.相关的.附加(class1) //****************************************************************************** //这是不可编译的 //****************************************************************************** 阶级软弱{ 弱var参考:T? 初始(uu参考:T){ self.reference=reference } } 协议协议:AnyObject{ 变量相关:[弱]{get set} } 协议ProtocolB:AnyObject{ 变量相关:[弱]{get set} } A类:ProtocolA{ var相关=[弱]() } B类:协议{ var相关=[弱]() } 设classA=classA() 设classB=classB()
classA.related.append(弱(classB))/–在这种情况下,您不能用
ProtocolB
ProtocolA
满足
Weak
的泛型占位符
T
,因为它们都不是当前符合
AnyObject
的类型。虽然我不太清楚为什么编译器首先让你说
,但是你可以把例子简化为
协议P:AnyObject{};C类{};让c=c

()

btw.@Hamish Your“minimizes to”示例产生错误“'P'不能转换为'AnyObject'”,这是不同的,但似乎是相关的(我在实际项目中也遇到过)。我打算研究“协议不…”这篇文章,但与此同时,我开始意识到,继承AnyObject的协议实际上不是AnyObject。但是,在运行时实际使用的任何东西都将是!这真是令人困惑。希望这篇文章能有所帮助。这是一个不同的错误,但问题是相同的–您可以在示例中通过显式声明通用占位符重现该错误,例如
classA.related.append(弱(classB))
。是的,这是编译器当前的一个恼人的限制,Swift团队希望在某个时候取消它。的可能重复–在这种情况下,你不能用
协议b
协议满足
弱的
的通用占位符
T
,因为当前符合
AnyObject
的类型都不是。虽然我不太清楚为什么编译器首先让你说
,但是你可以把例子简化为
协议P:AnyObject{};C类{};让c=c

()

btw.@Hamish Your“minimizes to”示例产生错误“'P'不能转换为'AnyObject'”,这是不同的,但似乎是相关的(我在实际项目中也遇到过)。我打算研究“协议不…”这篇文章,但与此同时,我开始意识到,继承AnyObject的协议实际上不是AnyObject。但是,在运行时实际使用的任何东西都将是!这真是令人困惑。希望这篇文章能有所帮助。这是一个不同的错误,但问题是相同的–您可以在示例中通过显式声明通用占位符重现该错误,例如
classA.related.append(弱(classB))
。是的,这是一个恼人的编译器当前的限制,虽然Swift团队希望在某个时候取消它。可能重复的