【问题标题】:swift - how to access public constants without having to instanciate class, as in C#swift - 如何访问公共常量而无需实例化类,如在 C# 中
【发布时间】:2014-09-14 13:50:37
【问题描述】:

不应需要创建类的实例来访问公共常量。我最近开始在 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。

【问题讨论】:

    标签: swift


    【解决方案1】:

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

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

    【讨论】:

    • 我同意结构体比枚举更合适,但可以在枚举中创建不同数据类型的静态不可变变量
    • enum。我们只能使用一种类型的关联值,因此您不能将stringIntvalues 与enums 完全绑定。
    • 在他的自我回答中,OP 使用枚举作为静态变量的容器 - 试试这个:enum Constants { static let myConstant = 5; static let myData = "hello" }
    • @Antonio 谢谢,我知道我们可以在enums 中包含“类型属性”。
    【解决方案2】:

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

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

    struct Constants {
        static let myConstant = 5
    }
    

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

    Constants.myConstant
    

    【讨论】:

      【解决方案3】:

      如果您想要一个常量,您还可以使用类计算属性“伪造”尚未支持的类变量,该属性当前有效:

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

      【讨论】:

        【解决方案4】:

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

        public enum NotificationMessage: String {
        
            case kTimerNotificationId = "NotificationIdentifier"
        }
        

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

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

        不要忘记 .rawValue。

        【讨论】:

          【解决方案5】:

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

          enum MyConstantsV2 {
              static var constX = 1
          }
          
          public class Consumerv2{
          
              func foo(){
                 var x = MyConstantsV2.constX;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-21
            • 1970-01-01
            • 2023-04-02
            相关资源
            最近更新 更多