У меня есть протокол, Address
, который наследует от другого протокола, Validator
и Address
выполняет Validator
требования в расширении.Невозможно использовать протокол как associatedtype в другом протоколе в Swift
Существует другой протокол, FromRepresentable
, который имеет associatedType
(ValueWrapper
) требование, которое должно быть Validator
.
Теперь, если я попытаюсь использовать Address
как associatedType
, то он не компилируется. Он говорит,
Inferred типа 'Адрес' (путем сопоставления требования 'valueForDetail') является недействителен: не соответствует 'Validator'.
Является ли это использование незаконным? Разве мы не можем использовать Address
вместо Validator
, так как все Addresses
являются Validator
.
Ниже приведен фрагмент кода, который я пытаюсь.
enum ValidationResult {
case Success
case Failure(String)
}
protocol Validator {
func validate() -> ValidationResult
}
//Address inherits Validator
protocol Address: Validator {
var addressLine1: String {get set}
var city: String {get set}
var country: String {get set}
}
////Fulfill Validator protocol requirements in extension
extension Address {
func validate() -> ValidationResult {
if addressLine1.isEmpty {
return .Failure("Address can not be empty")
}
return .Success
}
}
protocol FormRepresentable {
associatedtype ValueWrapper: Validator
func valueForDetail(valueWrapper: ValueWrapper) -> String
}
// Shipping Address conforming to Address protocol.
// It should also implicitly conform to Validator since
// Address inherits from Validator?
struct ShippingAddress: Address {
var addressLine1 = "CA"
var city = "HYD"
var country = "India"
}
// While compiling, it says:
// Inferred type 'Address' (by matching requirement 'valueForDetail') is invalid: does not conform
// to 'Validator'.
// But Address confroms to Validator.
enum AddressFrom: Int, FormRepresentable {
case Address1
case City
case Country
func valueForDetail(valueWrapper: Address) -> String {
switch self {
case .Address1:
return valueWrapper.addressLine1
case .City:
return valueWrapper.city
case .Country:
return valueWrapper.country
}
}
}
Update: Подал bug.
Хорошо, я понял, но есть ли причина, почему мы должны использовать конкретный тип для связанного типа с ограничением протокола? Компилятор не выдает никаких ошибок, если мы используем Address в качестве аргумента для функции, которая ожидает Validator. –
Я не понимаю, почему мы должны использовать конкретный тип, если у связанного типа есть ограничение по протоколу. Имеет ли это какое-то отношение к поведению инвариантности или распределению памяти? У вас есть ссылки, где я могу получить дополнительную информацию об этом. –
@ VishalSingh Боюсь, я не могу предложить лучшую причину, чем «потому что это так, как есть» - я, конечно, не могу придумать, почему это не должно быть возможно, потому что безусловная версия работает нормально , Я также не могу найти что-либо в списке рассылки быстрой эволюции или об ошибке. Возможно, стоит записать [отчет об ошибке] (https://bugs.swift.org/secure/Dashboard.jspa) и посмотреть, что они говорят об этом. – Hamish