Nehmen Sie diesen Code:Wie vermeidet man die Verwendung von A.self?
protocol P: class {
static var hello: String { get }
}
class A: P {
class var hello: String {
return "Hello"
}
}
class B: A {
override static var hello: String {
return "Hello World"
}
}
class C: A {}
class D: C {
override static var hello: String {
return "Hello D"
}
}
func sayHello(elements: P.Type...) {
for p in elements {
print(p.hello)
}
}
func sayHelloAgain(elements: A.Type...) {
for p in elements {
print(p.hello)
}
}
func sayHelloThe3rd(elements: [A.Type]) {
for p in elements {
print(p.hello)
}
}
sayHello(A.self, B.self, C.self)
sayHelloAgain(A.self, B.self, C.self)
Vergleichen sie dies (aus diesem presentation genommen)
func register<T: UITableViewCell where T: ReusableView, T: NibLoadableView>(_: T.Type) { ... }
tableView.register(FoodTableViewCell)
Warum muss ich A.self in einem Fall verwendet werden, aber nicht in der anderen? Und auch, müssen nicht verwenden .self beim Aufruf mit einem Argument.
sayHello(A)
sayHello(A, B) //doesn't compile
Der ältere Code, auf den Sie verweisen, generiert nun eine Warnung, dass Sie '.self' hinzufügen sollten. Es gab Fälle in früheren Versionen von Swift, in denen das '.self' erraten werden konnte und der Compiler es einstecken würde, aber Swift bewegt sich immer dazu, es immer zu benötigen, wie Alexander unten feststellt. –