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

n17*_*911 100 swift

我在我的功能中有这些定义

class MyClass {
    func myFunc() {
        let testStr = "test"
        let testStrLen = countElements(testStr)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    func myFunc() {

    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?我不想每次都计算一次不断的"测试".

根据我对以下评论的理解,我需要这样做:

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

    func myFunc() {

    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法我不需要输入/输入"test"两次?谢谢.

Mar*_*lme 175

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

struct MyClassConstants{
    static let testStr = "test"
    static let testStrLength = countElements(testStr)

    static let arrayOfTests: [String] = ["foo", "bar", testStr]
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您的常量将在声明的构造中进行范围化,而不是全局浮动.

更新

我添加了一个静态数组常量,以响应询问静态数组初始化的注释.请参阅"Swift编程语言"中的数组文字.

请注意,字符串文字和字符串常量都可用于初始化数组.但是,由于数组类型已知,testStrLength因此不能在数组初始值设定项中使用整数常量.

  • 因为我使用枚举而使用.rawValue节拍 (3认同)
  • 您能不能仅将常量声明为static private?他们会不再全球化吗? (2认同)
  • 如果代码也从 Objective C 使用,这将不是最好的解决方案,因为 Swift 结构不会转换为 Objective C (2认同)

Cle*_*rem 68

加入@ Martin的回答......

如果有人计划保持应用程序级别的常量文件,您可以根据其类型或性质对常量进行分组

struct Constants {
    struct MixpanelConstants {
        static let activeScreen = "Active Screen";
    }
    struct CrashlyticsConstants {
        static let userType = "User Type";
    }
}
Run Code Online (Sandbox Code Playgroud)

致电: Constants.MixpanelConstants.activeScreen

  • 谢谢.我喜欢这个,提供了一种通过struct管理常量的优雅方式. (2认同)

Chr*_*ver 14

如果我正确理解你的问题,你就会问你如何创建类级别常量(静态 - 用C++的说法),这样你就不会a)复制每个实例的开销,而b必须重新计算其他的常量.

语言已经发展 - 正如每个读者都知道的那样,但是当我在Xcode 6.3.1中测试它时,解决方案是:

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
Run Code Online (Sandbox Code Playgroud)

我不知道静态是否是严格必要的,因为编译器肯定只将每个const变量的一个条目添加到二进制的静态部分,但它确实会影响语法和访问.通过使用静态,即使您没有实例,也可以引用它:MyClass.testStrLen.


Nat*_*ook 11

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

let testStr = "test"
let testStrLen = countElements(testStr)

class MyClass {
    func myFunc() {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望这些是实例属性,则可以使用延迟存储属性作为长度 - 它将仅在第一次访问时进行评估,因此您不会反复计算它.

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

    func myFunc() {
    }
}
Run Code Online (Sandbox Code Playgroud)


Emi*_*ral 7

那么使用计算属性呢?

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

MyClass.myConstant
Run Code Online (Sandbox Code Playgroud)


Chi*_*ong 7

有些人可能希望某些类常量公开,而其他类私有.

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)")
}

}
Run Code Online (Sandbox Code Playgroud)

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

class MyClass2
{

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

} 
Run Code Online (Sandbox Code Playgroud)