如何在swift中定义类中的静态常量

我在这个工作中有这些定义

class MyClass { func myFunc() { let testStr = "test" let testStrLen = countElements(testStr) } } 

但是,如果我将“testStr”和“testStrLen”移动到类级别,它将不会编译。 它说'MyClass.Type没有名为'testStr'的成员。

 class MyClass { let testStr = "test" let testStrLen = countElements(testStr) func myFunc() { } } 

我怎样才能解决这个问题? 我不想每次都支付一个经常testing的“len”的罚款。

基于我对下面的评论的理解,我需要这样做:

 class MyClass { let testStr = "test" let testStrLen = countElements("test") func myFunc() { } } 

有没有办法,我不需要input/input“testing”两次? 谢谢。

在Swift中声明一个类的常量的一个很好的习惯用法就是使用一个名为MyClassConstants的结构,如下所示。

 struct MyClassConstants{ static let testStr = "test" static let testStrLength = countElements(testStr) static let arrayOfTests: [String] = ["foo", "bar", testStr] } 

通过这种方式,你的常量将被限定在一个声明的结构中,而不是全局浮动。

更新

我已经添加了一个静态数组常量,作为对静态数组初始化的评论。 请参阅“Swift编程语言”中的数组文字 。

请注意,string文字和string常量都可以用来初始化数组。 但是,由于数组types是已知的,整数常量testStrLength不能用于数组初始值设定项中。

添加到@ Martin的答案…

如果有人打算保持一个应用程序级别的常量文件,您可以根据其types或性质对常量进行分组

 struct Constants { struct MixpanelConstants { static let activeScreen = "Active Screen"; } struct CrashlyticsConstants { static let userType = "User Type"; } } 

调用: Constants.MixpanelConstants.activeScreen

如果你真的想要你的类的静态属性,那在Swift中目前还不支持。 目前的build议是通过使用全局常量来解决这个问题:

 let testStr = "test" let testStrLen = countElements(testStr) class MyClass { func myFunc() { } } 

如果你希望这些属性是实例属性,那么你可以在这个长度上使用一个懒惰的存储属性 – 它只会在第一次被访问时被评估,所以你不会一遍又一遍地计算它。

 class MyClass { let testStr: String = "test" lazy var testStrLen: Int = countElements(self.testStr) func myFunc() { } } 

如果我正确地理解了你的问题,你问的是如何创build类级别的常量(静态 – 用C ++的说法),使得你不需要a)在每个实例中复制开销,并且b必须重新计算其他常量。

语言已经发展 – 每个读者都知道,但是当我在Xcode 6.3.1中testing时,解决scheme是:

 import Swift class MyClass { static let testStr = "test" static let testStrLen = count(testStr) init() { println("There are \(MyClass.testStrLen) characters in \(MyClass.testStr)") } } let a = MyClass() // -> There are 4 characters in test 

我不知道静态是否是绝对必要的,因为编译器肯定只会为每个常量variables添加一个条目到二进制文件的静态部分,但是这会影响语法和访问。 通过使用静态,即使没有实例MyClass.testStrLen ,也可以引用它。

如何使用计算的属性?

 class MyClass { class var myConstant: String { return "What is Love? Baby don't hurt me" } } MyClass.myConstant 

有些人可能希望公开某些类常量,而另一些则是私有的

private关键字可以用来限制同一个swift文件中的常量范围。

 class MyClass { struct Constants { static let testStr = "test" static let testStrLen = testStr.characters.count //testInt will not be accessable by other classes in different swift files private static let testInt = 1 } func ownFunction() { var newInt = Constants.testInt + 1 print("Print testStr=\(Constants.testStr)") } } 

其他类将能够访问您的类常量,如下所示

 class MyClass2 { func accessOtherConstants() { print("MyClass's testStr=\(MyClass.Constants.testStr)") } } 

试玩在操场上

 class MyClass { struct Constants { static let testStr = "test" static let testStrLen = testStr.characters.count //testInt will not be accessable by other classes in different swift files private static let testInt = 1 static func singletonFunction() { //accessable print("Print singletonFunction testInt=\(testInt)") var newInt = testStrLen newInt = newInt + 1 print("Print singletonFunction testStr=\(testStr)") } } func ownFunction() { //not accessable //var newInt1 = Constants.testInt + 1 var newInt2 = Constants.testStrLen newInt2 = newInt2 + 1 print("Print ownFunction testStr=\(Constants.testStr)") print("Print ownFunction newInt2=\(newInt2)") } } let newInt = MyClass.Constants.testStrLen print("Print testStr=\(MyClass.Constants.testStr)") print("Print testInt=\(newInt)") let myClass = MyClass() myClass.ownFunction() MyClass.Constants.singletonFunction() 

class MyClass { struct Constants { static let testStr = "test" static let testStrLen = testStr.characters.count //testInt will not be accessable by other classes in different swift files private static let testInt = 1 static func singletonFunction() { //accessable print("Print singletonFunction testInt=\(testInt)") var newInt = testStrLen newInt = newInt + 1 print("Print singletonFunction testStr=\(testStr)") } } func ownFunction() { //not accessable //var newInt1 = Constants.testInt + 1 var newInt2 = Constants.testStrLen newInt2 = newInt2 + 1 print("Print ownFunction testStr=\(Constants.testStr)") print("Print ownFunction newInt2=\(newInt2)") } } let newInt = MyClass.Constants.testStrLen print("Print testStr=\(MyClass.Constants.testStr)") print("Print testInt=\(newInt)") let myClass = MyClass() myClass.ownFunction() MyClass.Constants.singletonFunction()