如果Swift中的“let”关键字被用来定义常量/不可变项,那么“static”关键字有什么用?

xt0899hw  于 2023-11-16  发布在  Swift
关注(0)|答案(7)|浏览(212)

我对在Swift中使用static关键字有点困惑。正如我们所知,Swift引入了let关键字来声明不可变对象。就像声明一个表视图单元格的id,它在其生命周期中很可能不会改变。现在,在一些结构体声明中使用static关键字有什么用呢?

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

字符串
let关键字做同样的事情。在Objective C中,我们使用static来声明一些常量,如

static NSString *cellIdentifier=@"cellId";


此外,让我更好奇的是,static关键字沿着与letvar关键字一起使用。有人能解释一下在哪里使用这个static关键字吗?更重要的是,我们真的需要static吗?

yiytaume

yiytaume1#

让我解释给那些需要E-C参考的人。
希望你们都记得,我们在我们的CNET-C项目中使用了一个常量文件来保存所有静态API键,如下所示。

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

字符串
这里的关键字Static并不意味着kNSStringConst是一个常量,它只是定义了kNSStringConst可以全局访问。关键字const使其成为常量。
现在让我们转向Swift。
在Swift中,Static letStatic var被认为是Type Properties,这意味着它们可以通过其类型进行访问。
例如:

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可以通过它的类型访问,但是不能被改变。
1.声明的Static var不仅可以通过其类型访问,还可以修改。因此,所有未来的示例都将被更改。

bjg7j2ky

bjg7j2ky2#

Swift's property(https://stackoverflow.com/a/60913330/4770877)
var vs let(https://stackoverflow.com/a/59219124/4770877)的
class vs static(https://stackoverflow.com/a/59236762/4770877)的
简单地说,classstatic是type属性,属于Type的一个副本

wbgh16ku

wbgh16ku3#

我将为你分解它们:

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

现在你可以合并来获得所需的出来:

  • 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

字符串

k75qkfdt

k75qkfdt4#

一个静态变量在一个类的所有示例中共享。把这个例子扔到操场上:

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

字符串
当您更改静态属性的变量时,该属性现在在所有将来的示例中都将更改。

kg7wmglp

kg7wmglp5#

静态变量属于一个类型而不是类的示例。你可以通过使用类型的全名来访问静态变量。
代码:

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

字符串
希望这对你有帮助。

jdzmm42g

jdzmm42g6#

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

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

字符串
静态属性只能在类型上声明,不能全局声明。换句话说,在Swift中,静态属性===类型属性。要声明类型属性,必须使用static关键字。

l3zydbqr

l3zydbqr7#

**“let关键字定义了一个常量”**对于来自C#背景的初学者(比如我)来说是令人困惑的。在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。所以,我在swift中同时使用staticlet来定义常量。

相关问题