什么是"静态"关键字if" let"用于在swift中定义常量/不可变的关键字?

时间:2016-01-03 09:01:57

标签: swift static constants

我对在swift中使用 static 关键字感到有点困惑。我们知道swift引入了 let 关键字来声明不可变对象。就像声明表视图单元的id一样,它最有可能在其生命周期内不会发生变化。现在,在某些结构声明中使用 static 关键字是什么:

struct classConstants
{
    static let test = "test"
    static var totalCount = 0
}

关键字执行相同的操作。在Objective C中,我们使用static来声明一些常量,如

static NSString *cellIdentifier=@"cellId";

除此之外,我更加好奇的是使用静态关键字以及 let 以及 var 关键字。谁能解释一下我在哪里使用这个静态关键字?更重要的是,我们真的需要swift中的 static 吗?

7 个答案:

答案 0 :(得分:101)

我会为你打破它们:

  • var:用于创建变量
  • let:用于创建常量
  • static:用于letvar创建type properties。这些在类的所有对象之间共享。

现在你可以结合起来得到所需的结果:

  • static let key = "API_KEY":输入常量的属性
  • static var cnt = 0:输入属性
  • 的属性
  • let id = 0:常量(只能分配一次,但可以在运行时分配)
  • var price = 0:变量

所以总结一下var并让我们在静态和缺乏定义范围时定义可变性。您可以使用static var来跟踪已创建的实例数,而您可能只想使用var来获得与对象不同的价格。希望这可以解决一些问题。

示例代码:

class MyClass{
    static let typeProperty = "API_KEY"
    static var instancesOfMyClass = 0
    var price = 9.99
    let id = 5

}

let obj = MyClass()
obj.price // 9.99
obj.id // 5

MyClass.typeProperty // "API_KEY"
MyClass.instancesOfMyClass // 0

答案 1 :(得分:72)

静态变量通过类的所有实例共享。在操场上抛出这个例子:

class Vehicle {
    var car = "Lexus"
    static var suv = "Jeep"
}

// changing nonstatic variable
Vehicle().car // Lexus
Vehicle().car = "Mercedes"
Vehicle().car // Lexus

// changing static variable
Vehicle.suv // Jeep
Vehicle.suv = "Hummer"
Vehicle.suv // Hummer

当您更改静态属性的变量时,该属性现在将在以后的所有实例中更改。

答案 2 :(得分:10)

静态变量属于类型而不是类的实例。您可以使用类型的全名来访问静态变量。

代码:

class IOS {

  var iosStoredTypeProperty = "iOS Developer"

  static var swiftStoredTypeProperty = "Swift Developer"

 }

 //Access the iosStoredTypeProperty by way of creating instance of IOS Class

let iOSObj = IOS()

print(iOSObj.iosStoredTypeProperty)  // iOS Developer


 //print(iOSObj.swiftStoredTypeProperty) 
 //Xcode shows the error 
 //"static member 'swiftStoredTypeProperty' cannot be used on instance of type IOS”


 //You can access the static property by using full name of the type
print(IOS.swiftStoredTypeProperty)  // Swift Developer

希望这可以帮助你..

答案 3 :(得分:1)

要查看类型属性和/或方法与类属性和/或方法之间的区别,请查看来自apple docs的这个自解释示例

class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

静态属性只能在类型上声明,而不能在全局声明。换句话说,Swift中的静态属性=== type属性。要声明type属性,必须使用static keyword。

答案 4 :(得分:1)

“let关键字定义常量”让来自C#background(像我)的初学者感到困惑。 在C#术语中,您可以将“let”视为“只读”变量

(回答How exactly does the “let” keyword work in Swift?

同时使用staticlet来定义常量

public static let pi = 3.1416            // swift

public const double pi = 3.1416;         // C#
public static final double pi = 3.1416   // Java     

每当我使用let来定义常量时,感觉就像是在使用C#的readonly。因此,我使用staticlet来定义swift中的常量。

答案 5 :(得分:1)

让我为那些需要 Objective-C 参考的人解释一下。

希望你们都记得我们在 Objective-C 项目中使用了一个常量文件来保存所有静态 API 密钥,如下所示。

/ In your *.m file
static NSString * const kNSStringConst = @"const value";

这里的关键字Static并不意味着kNSStringConst是一个常量,它只是定义了kNSStringConst可以被全局访问。他们的关键字 const 使其保持不变。

现在让我们转向 Swift。

在 Swift 中,Static letStatic var 被视为类型属性,这意味着可以通过它们的类型访问它们。< /p>

例如:

class World {
   static let largestPopulation = "China"
   static var secondLargestPopulation = "India"
}

World.largestPopulation = "German"   // Cannot assign to property: 'largestPopulation' is a 'let' constant
World.secondLargestPopulation = "UK"
World.secondLargestPopulation // UK

在这个例子中,两个属性有 static 关键字,一个是常量,另一个是变量。

  1. 如您所见,声明的常量 Static let 可以通过其类型访问,但不能访问 改变了。
  2. 声明的 Static var 不仅可以通过其类型访问,还可以修改。因此,所有未来的实例都将发生变化。

答案 6 :(得分:0)

[Swift's property]
[var vs let]
[class vs static]

简而言之,classstatic是type属性,在单个副本中属于Type