verallgemeinern Der Versuch, Ich versuche, eine generali Klasse in Swift, Xcode 7.3 (so Swift 2.2) zu erstellen, aber ich kann es nicht vorbei an den Compiler scheinen zu bekommen:in schnellen
protocol Struct1Protocol {
}
struct Struct1 {
var name1: String
}
protocol Struct2Protocol {
}
struct Struct2: Struct2Protocol {
var name2: String
}
class StructDependent<T> {
func setupFrom<T:Struct1Protocol>(value: T) {
print("we want to setup StructDependent with struct 1")
}
func setupFrom<T:Struct2Protocol>(value: T) {
print("we want to setup StructDependent with struct 2")
}
}
class A<T> {
func test(value: T) {
let structInstance = StructDependent<T>()
// this gives a compiler error:
// Cannot invoke 'setupFrom' with an argument list of type '(T)'
structInstance.setupFrom(value)
}
}
Die Idee ist, habe eine StructDependent
, die aus verschiedenen Strukturen aufgebaut werden kann. Klasse A sollte in der Lage sein, setupFrom aufzurufen, wenn die Klasse mit einer kompatiblen Struktur instanziiert wurde. Wie so:
let a = A<Struct1>()
let v = Struct1(name1: "")
a.test(v)
Wie würde ich darüber gehen? Ich bin hier ein bisschen blockiert, also sind alle Ideen willkommen.
Ich weiß nicht, wie das da reingekommen ist, muss versehentlich in meinem Copy Paste Buffer gewesen sein. Ich korrigierte den Beispielcode zu dem, was ich in Xcode habe. –
Okay, aber es ist immer noch das gleiche Problem. Es gibt nichts über "value: T", um dem Compiler mitzuteilen, dass "T" Struct1Protocol oder Struct2Protocol annimmt. Wie kann es dann verwendet werden, wo ein Struct1Protocol oder Struct2Protocol benötigt wird? – matt
Warum haben Sie nicht Struct1 und Struct2 adoptieren _the same_ Protokoll? Auf diese Weise können Sie auch "value: T" eingeben. – matt