swift - 如何在不必实例化类的情况下访问公共常量,如在C#中

时间:2014-09-14 13:50:37

标签: swift

不应该需要创建一个类的实例来访问公共常量。我最近开始在Swift工作,所以我必须在这里遗漏一些东西。

在这个简单的例子中:

public class MyConstants{
    public let constX=1;
}
public class Consumer{
     func foo(){
          var x = MyConstants.constX;// Compiler error: MyConstants don't have constX
     }
}

这个foo代码给出了编译错误。为了工作,我需要像这样创建一个MyConstants实例:

public class Consumer{
     func foo(){
       var dummy = MyConstants();
       var x = dummy.constX;
    }
}

不允许向constX添加静态。

5 个答案:

答案 0 :(得分:18)

structstatic类型结合使用。struct更合适,因为在enum中您只能绑定一种类型的关联值,但您可以包含“类型属性”任何类型“在两者中。

public struct MyConstants{
    static let constX=1;
}
public class Consumer{
    func foo(){
        var x = MyConstants.constX;
    }
} 

答案 1 :(得分:7)

您应该使用不可变的静态变量。不幸的是,类仅使用class修饰符支持计算属性 - 编译器输出错误,指出类变量不支持

但在结构中,可以创建静态数据成员:

struct Constants {
    static let myConstant = 5
}

当然不需要创建实例,因为可以简单地访问不可变的静态属性:

Constants.myConstant

答案 2 :(得分:2)

如果你想要一个常数,你也可以"假的"具有类计算属性的尚未支持的类变量,它当前有效:

public class MyConstants{
    public class var constX: Int { return 1 };
}
public class Consumer{
    func foo(){
        var x = MyConstants.constX; // Now works fine.
    }
}

答案 3 :(得分:1)

对于字符串常量,我所做的是以下列方式将一堆常量放入负责的类文件中:

public enum NotificationMessage: String {

    case kTimerNotificationId = "NotificationIdentifier"
}

然后从代码的任何其他位置使用它:

println("\(NotificationMessage.kTimerNotificationId.rawValue)")

不要忘记.rawValue。

答案 4 :(得分:0)

我找到了下面的解决方案,但希望有人能澄清或发布更好的解决方案

enum MyConstantsV2 {
    static var constX = 1
}

public class Consumerv2{

    func foo(){
       var x = MyConstantsV2.constX;
    }
}