"let" 和 "static let" 有什么区别?

What is the difference between "let" and "static let"?

class Foo {
    let fooValue = 1
}

print(Foo.fooValue) // not work


class Bar {
    static let barValue = 1
}

print(Bar.barValue) // work; print "1"

为什么?我希望 Foo 示例能够工作,因为 fooValue 的值是常量,在编译时已知值和内存地址。但我需要使用关键字 static 才能工作。

您无需实例化 class 即可访问静态属性

如果您想在第一次 class 中访问它,请使用

Foo().fooValue

通常您希望对要访问的属性使用静态,而不必每次都实例化对象

fooValue 是一个 实例 属性Foo class.

的每个实例(对象)都有一个单独的 fooValue

barValue 是一个 静态 属性。有一个共享 barValue 属于 class。

这是一个更具体的例子。假设我有这个 class:

class Human {
    static let numberOfLimbs = 4
    let name: String
}

如果我问你人类的名字是什么,你会怎么想? IE。 Human.name。好吧,你无法回答我,因为没有一个名字是所有人类的名字。每个人都会有一个单独的名字。但是,您可以告诉我人类的四肢数量,(Human.numberOfLimbs),(几乎)总是 4。