swift – 如何避免使用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)

比较一下(取自这个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,但我不知道这样的功能.我有兴趣了解一下.

点赞