Невозможно использовать associatedType в качестве метода returnType в Swift, поскольку компилятор выдает «неоднозначный вывод связанного типа» - PullRequest
0 голосов
/ 04 августа 2020

Играл с associatedType. Компилятор не распознает возвращаемый тип метода при использовании associatedType.

Вот пример кода,

protocol DummyOffice {
}

struct EmptyOffice: DummyOffice {
}

protocol  Office {
    associatedtype SubBranch: DummyOffice
    var subBranch: SubBranch { get }
    func getSubBranch() -> SubBranch
}

struct Apple: Office {
    let emptyOffice = EmptyOffice()
    func getSubBranch() -> some DummyOffice {
        return EmptyOffice()
    }
    
    var subBranch: some DummyOffice {
        return EmptyOffice()
    }
}

, и компилятор выдает эту ошибку.

введите описание изображения здесь

Вопросы:

(1) Ошибка не возникает для свойства «subBranch». Дело в том, что если бы я не создавал в протоколе метод, возвращающий связанный тип, все работает гладко.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Использование непрозрачного типа возврата (например, some) не требуется для того, что вы хотите сделать. Когда вы go реализуете протокол Office, просто верните тип фактический из функции и вычисляемого свойства, которые вы указали, и компилятор выведет associatedtype для вас:

protocol DummyOffice {}

struct EmptyOffice: DummyOffice {}

protocol Office {
    associatedtype SubBranch: DummyOffice
    var subBranch: SubBranch { get }
    func getSubBranch() -> SubBranch
}

struct Apple: Office {
    let emptyOffice = EmptyOffice()
    func getSubBranch() -> EmptyOffice {
        return EmptyOffice()
    }
    
    var subBranch: EmptyOffice {
        return EmptyOffice()
    }
}
0 голосов
/ 05 августа 2020

Как предложил @zaitsman, замена сопоставленных типов на typealias работает хорошо.

Но typealias не может использоваться как ограничение psuedo generi c,

protocol DummyOffice {
}

struct EmptyOffice: DummyOffice {
}

protocol  Office {
    typealias SubBranch =  DummyOffice
    var subBranch: SubBranch { get }
    func getSubBranch() -> SubBranch
}

struct Apple: Office {
    var subBranch: Self.SubBranch
    
    func getSubBranch() -> Self.SubBranch {
        return EmptyOffice()
    }
    
}
...