Stworzyłem 2 protokoły z powiązanymi typami. Typ zgodny z Reader
powinien być w stanie wytworzyć instancję typu zgodnego z Value
.Protokół Swift z ograniczonym typem błędu "Typ nie jest wymienialny"
Warstwa złożoności wynika z rodzaju zgodnego Manager
powinny być w stanie wytworzyć konkretną Reader
wystąpienie który wytwarza konkretny typ Value
(albo Value1
lub Value2
).
Z moją konkretną implementacją Manager1
chciałbym, aby zawsze produkować Reader1
, która z kolei produkuje instancje Value1
.
Może ktoś wyjaśnić, dlaczego
"Reader1 is not convertible to ManagedReaderType?"
Gdy błędna linia zmienia się na (na razie) powrócić nil
wszystko kompiluje dobrze, ale teraz nie mogę instancję albo Reader1
lub Reader2
.
Poniższa może być wklejony do placu zabaw, aby zobaczyć błąd:
import Foundation
protocol Value {
var value: Int { get }
}
protocol Reader {
typealias ReaderValueType: Value
func value() -> ReaderValueType
}
protocol Manager {
typealias ManagerValueType: Value
func read<ManagerReaderType: Reader where ManagerReaderType.ReaderValueType == ManagerValueType>() -> ManagerReaderType?
}
struct Value1: Value {
let value: Int = 1
}
struct Value2: Value {
let value: Int = 2
}
struct Reader1: Reader {
func value() -> Value1 {
return Value1()
}
}
struct Reader2: Reader {
func value() -> Value2 {
return Value2()
}
}
class Manager1: Manager {
typealias ManagerValueType = Value1
let v = ManagerValueType()
func read<ManagerReaderType: Reader where ManagerReaderType.ReaderValueType == ManagerValueType>() -> ManagerReaderType? {
return Reader1()// Error: "Reader1 is not convertible to ManagedReaderType?" Try swapping to return nil which does compile.
}
}
let manager = Manager1()
let v = manager.v.value
let a: Reader1? = manager.read()
a.dynamicType
typalias ManagerValueType: Wartość jest niepoprawna - definiujesz typ z "=", np. Typalias ManagerValueType = Wartość –
'typalias ManagerValueType: Wartość' w protokole' Manager' to ograniczenie, * nie * ustawienie typu. – Jay
Czy ten kod jest tylko krótkim przykładem większego projektu lub czy jest to Twoja ciekawość, jak rozwiązać ten problem? – Qbyte