不应该需要创建一个类的实例来访问公共常量。我最近开始在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添加静态。
答案 0 :(得分:18)
将struct
与static
类型结合使用。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;
}
}