我对在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 吗?
答案 0 :(得分:101)
我会为你打破它们:
var
:用于创建变量let
:用于创建常量static
:用于let
或var
创建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?)
同时使用static
和let
来定义常量
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
。因此,我使用static
和let
来定义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 let 和 Static 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 关键字,一个是常量,另一个是变量。
答案 6 :(得分:0)
[Swift's property]
[var vs let]
[class vs static]
简而言之,class
和static
是type属性,在单个副本中属于Type