拿这个代码:
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)
比较一下(取自这个presentation)
func register<T: UITableViewCell where T: ReusableView, T: NibLoadableView>(_: T.Type) { ... }
tableView.register(FoodTableViewCell)
为什么我必须在一个案例中使用A.self,而在另一个案例中不能使用A.self?
而且,在使用一个参数调用时不需要使用.self.
sayHello(A)
sayHello(A, B) //doesn't compile
最佳答案 .self是句法盐.从技术角度来看,它不是必需的,但它存在导致代码中的错误,这通常是错字的结果,例如:
struct Foo { }
let foo = Foo
此代码将为您提供编译器错误,告诉您要么需要完成初始化程序/函数/方法调用,要么附加.self,如果您要引用该类型.
在后一个例子中,上下文专门处理类型而不是值,因此没有机会将一个与另一个混淆,因此,.self不是必需的.
也许有一种方法可以修改你的例子中的函数声明,以便不需要.self,但我不知道这样的功能.我有兴趣了解一下.