Декодируемое соответствие с другими протоколами в Swift - PullRequest
0 голосов
/ 05 августа 2020

Проблема заключается в том, что структура соответствует протоколу (назовем ее PA) и Decodable, но PA накладывает свойство с типом, который не является Decodable. Пример:

protocol PA {
    var b: [PB]? { get }
}

protocol PB {}

struct SA: PA, Decodable {
    let b: [PB]? // SA's conformance to Decodable wants this to be [Decodable], but PA's conformance imposes [PB]
}

struct SB: PB, Decodable {}

приведенный выше код отказывается компилироваться, с:

  • ошибка: тип «SA» не соответствует протоколу «Decodable»
  • примечание : не может автоматически синтезировать 'Decodable', потому что '[PB]?' не соответствует 'Decodable'

Изменение этой строки на:

let b: [PB & Decodable]?

тоже не работает и дает:

  • error: type ' SA 'не соответствует протоколу' PA '
  • примечание: кандидат имеет несовпадающий тип' [Decodable & PB]? '
  • ошибка: тип' SA 'не соответствует протоколу' Decodable '
  • Примечание: не может автоматически синтезировать' Decodable ', потому что' [Decodable & PB]? ' не соответствует 'Decodable'
  • примечание: протокол требует свойства 'b' с типом '[PB]?'; вы хотите добавить заглушку?

Обратите внимание, что 4-я строка бессмысленна: «'[Decodable & PB]?' не соответствует «Decodable» ». Подождите, что?

Есть предложения?

Ответы [ 2 ]

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

Вы можете создать смешанный протокол:

protocol PADecodable {
    var b: [PB & Decodable]? { get }
}

struct SA: PADecodable {
    let b: [PB & Decodable]?
}
0 голосов
/ 05 августа 2020

можно исправить:

protocol PA {
    var b: [PB]? { get }
}

protocol PB {}

struct SA<T: PB & Codable>: PA, Codable {
    private var _b: [T]?
    
    var b: [PB]? {
        return _b
    }
}
...