2017-02-23 77 views
0
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才能工作。“let”和“static let”之间的区别是什么?

+2

作为一个'let'只是意味着它是一个常数 - 它与该属性是无关的可以从实例或静态作用域访问。另请参阅[如果在“swift”中使用“let”关键字来定义常量/不可变项,有什么用“static”关键字](http://stackoverflow.com/q/34574876/2976878) – Hamish

回答

9

fooValue实例属性Foo类的每个实例(对象)都有一个单独的fooValue

barValue静态属性。共有一个属于该类的共享barValue

下面是一个更具体的例子。假设我有这样的课程:

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

如果我问你一个人的名字是什么,你会发生什么?即Human.name。那么,你将无法回答我,因为没有任何一个人的单一名称。每个人都有一个单独的名字。然而,你可以告诉我人类肢体的数量,(Human.numberOfLimbs),这是(几乎)总是4.

+0

谢谢澄清。但是,在我的例子中,'let fooValue = 1'具有与'static let barValue = 1'相同的行为,因为两者都是constantes值,但是'Bar'花费的内存少于'Foo'。在什么情况下更好地使用像'Foo'这样的代码? – Macabeus

+1

@Macabeus他们并不完全相同的行为。一个为单个值分配单个内存,该单个值绑定到类,另一个表示为每个从该类创建的新实例分配一些内存以获取新值。他们的用例是完全不同的,但很难解释,直到你学习面向对象编程的基础知识 – Alexander

0

你不必实例化类来访问静态属性

,如果你想访问你的第一类使用

Foo().fooValue 

通常要使用静态为想要的属性访问时无需每次都实例化对象

相关问题