如何在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()