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团队希望在某个时候取消它。可能重复的