【问题标题】:Swift: class and properties - all only initialized onceSwift:类和属性——都只初始化一次
【发布时间】:2015-04-10 12:38:03
【问题描述】:

我希望有一个具有属性的类或结构(没关系),其中所有内容都只能在应用程序中初始化一次。任何修改类或其属性的尝试都将失败或不可能。

这可能吗?

到目前为止,我已经想出了这个:

public struct ScreenInfo
{
    static var scaleFactor:Int = 0

    public init(initialScaleFactor:Int)
    {
        if (ScreenInfo.scaleFactor == 0) {
            ScreenInfo.scaleFactor = initialScaleFactor
        }
    }

    public static func getScaleFactor()
    -> Int
    {
        return scaleFactor
    }
}

let si1:ScreenInfo = ScreenInfo(initialScaleFactor:11)
ScreenInfo.getScaleFactor()    // = 11

let si2:ScreenInfo = ScreenInfo(initialScaleFactor:22)
ScreenInfo.getScaleFactor()    // = 11

【问题讨论】:

  • 尝试使用单例模式

标签: class swift struct static singleton


【解决方案1】:

你想要的有点不寻常,但它是可能的。

public struct ScreenInfo {
  private static var _scaleFactor: Int?
  public static var scaleFactor: Int? {
    set {
      if _scaleFactor == nil {
        _scaleFactor = newValue
      } else {
        // Optionally throw an exception or something
      }
    }
    get {
      return _scaleFactor
    }
  }
}

ScreenInfo.scaleFactor       // nil
ScreenInfo.scaleFactor = 5
ScreenInfo.scaleFactor       // 5
ScreenInfo.scaleFactor = 15
ScreenInfo.scaleFactor       // 5

【讨论】:

  • 几乎完美的例子,_scaleFactor 属性即使设置为私有也是可访问的,并且可以设置这反过来会改变_scaleFactorscaleFactor
  • 可以在同一个文件中访问,是的。如果你把结构体的定义放在它自己的文件中,它就不能被访问。
  • 是的,我刚刚在操场上看到了。 thx...好吧,回到完美主义!
猜你喜欢
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 2014-11-22
  • 2018-09-11
相关资源
最近更新 更多