Ich habe ein Protokoll, Address
, die von einem anderen Protokoll erbt, Validator
und Address
erfüllt die Validator
Anforderung in der Verlängerung.kann nicht in Swift in einem anderen Protokoll Protokoll als associatedtype verwendet
Es ist ein weiteres Protokoll, FromRepresentable
, die eine associatedType
(ValueWrapper
) Anforderung hat die Validator
sein sollte.
Wenn ich jetzt versuche, Address
als associatedType
zu verwenden, dann kompiliert es nicht. Er sagt,
Inferred Typ 'Adresse' (durch entsprechende Anforderung 'valueForDetail') ist ungültig: nicht entspricht 'Validator'.
Ist diese Verwendung illegal? Sollten wir nicht in der Lage sein Address
anstelle von Validator
zu verwenden, wie alle Addresses
sind Validator
.
Unten ist das Stück Code, den ich versuche.
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: Filed ein bug.
Okay, ich bekomme es, aber gibt es einen Grund, warum wir concreteType für einen associatedType mit einer Protokollbeschränkung verwenden müssen? Compiler gibt keinen Fehler aus, wenn wir Adresse als Argument für eine Funktion verwenden, die Validator erwartet. –
Ich verstehe es nicht, warum müssen wir konkreten Typ verwenden, wenn AssociatedType Protokolleinschränkung hat. Hat es etwas mit Invarianzverhalten oder Speicherzuordnung zu tun? Haben Sie einen Hinweis, wo ich mehr Informationen dazu finden kann? –
@VishalSingh Ich kann leider keinen besseren Grund als "weil das so ist" anbieten - ich kann mir keinen Grund vorstellen, warum es nicht möglich sein sollte, da die uneingeschränkte Version gut funktioniert . Ich kann auch nichts über die evolution Mailingliste oder den Bugtracker finden. Es könnte sich lohnen, einen [Fehlerbericht] (https://bugs.swift.org/secure/Dashboard.jspa) einzureichen und zu sehen, was sie dazu sagen. – Hamish