【问题标题】:How to avoid using A.self?如何避免使用 A.self?
【发布时间】:2016-08-09 05:40:10
【问题描述】:

获取此代码:

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,而在另一种情况下不用? 而且,使用一个参数调用时不需要使用 .self。

sayHello(A)
sayHello(A, B) //doesn't compile

【问题讨论】:

  • 您引用的旧代码现在会生成一个警告,您应该添加.self。在早期版本的 Swift 中,.self 可能会被猜到,编译器会坚持使用它,但正如 Alexander 在下面所述,Swift 将始终需要它。

标签: swift


【解决方案1】:

.self 是语法盐。从技术角度来看,这不是必需的,但它的存在会导致代码中的错误,这通常是由拼写错误导致的,例如:

struct Foo { }

let foo = Foo

这段代码会给你一个编译器错误,告诉你要么需要完成初始化程序/函数/方法调用,或者如果你想引用类型,则附加.self

在后一个示例中,上下文只处理类型而不是值,因此不可能将一个与另一个混淆,因此,.self 不是必需的。

也许有一种方法可以修改示例中的函数声明,从而不需要.self,但我不知道有这样的功能。我很想知道。

【讨论】:

  • 不知道语法盐这个词。
  • @LescaiIonel 是的,大多数语言都有。例如,Swift 要求在 switch 语句中使用 fallthrough 关键字,以避免意外的隐式失败。 var 也是语法盐,用于通知用户可能不需要的突变,但它也使代码意图更清晰。
猜你喜欢
  • 2011-11-02
  • 2017-07-09
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多