Невозможно использовать протокол как связанный тип в другом протоколе в Swift

У меня есть протокол,Address, который наследуется от другого протокола,Validator, а такжеAddress выполняетValidator требование в расширении.

Есть другой протокол,FromRepresentable, который имеетassociatedType (ValueWrapper) требование, которое должно бытьValidator.

Теперь, если я попытаюсь использоватьAddress какassociatedTypeто не компилируется. Это говорит,

Предполагаемый тип 'Адрес' (в соответствии с требованием '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
        }
    }
}

Обновить: Подалошибка.

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

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