Протокол не соответствует самому себе?

дал код игровой площадки ниже, чтобы проиллюстрировать сложность моего текущего проекта. Может кто-нибудь помочь мне понять ошибку компилятора в последней строке?

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>'

[Я добавляю слова в конец этого вопроса, чтобы было достаточно слов, чтобы сделать переполнение стека «проверкой корректности» счастливым. Я действительно думаю, что больше ничего не могу сказать, чтобы внести ясность в мой вопрос. Ошибка компилятора говорит само за себя]

 Hamish22 нояб. 2017 г., 18:24
Протоколы не всегда соответствуют самим себе - в этом случае вы не можете удовлетворитьWeakродовой заполнительT с участиемProtocolB или жеProtocolAкак и типы, которые в настоящее время соответствуютAnyObject, Хотя я не совсем уверен, почему компилятор позволяет вам сказатьWeak<ProtocolB> на первом месте...
 Verticon22 нояб. 2017 г., 19:22
@Hamish В вашем примере «minimizes to» выдается ошибка «P» не конвертируется в «AnyObject», который отличается, но кажется связанным (и с которым я также сталкиваюсь в моем реальном проекте). Я намерен изучить пост "Протоколы не ...", но тем временем начинает погружаться в то, что протокол, который наследует AnyObject, на самом деле не является AnyObject. Но то, что на самом деле привыкнет во время выполнения, будет! Это чертовски запутанно. Надеюсь, пост поможет.
 Hamish22 нояб. 2017 г., 19:25
Это другая ошибка, но это та же проблема - вы можете воспроизвести эту ошибку в своем примере, явно указав общий заполнитель, напримерclassA.related.append(Weak<ProtocolB>(classB)), И да, это раздражающее текущее ограничение компилятора, хотя команда Swift надеется снять его в какой-то момент.
 Hamish22 нояб. 2017 г., 18:25
Вы можете свести пример к минимумуprotocol P : AnyObject {}; class C<T : AnyObject> {}; let c = C<P>() Кстати.
 Hamish29 нояб. 2017 г., 23:07

Ответы на вопрос(0)

Ваш ответ на вопрос