【问题标题】:Creating singleton in Swift在 Swift 中创建单例
【发布时间】:2014-08-27 13:15:10
【问题描述】:

我已经成功的在 Swift 中创建了一个单例对象,但是我觉得实现起来比较冗长。有没有办法缩短这段代码?并将多个格式化程序组合成一个类,其中每个格式化程序都是自己的单例?

import Foundation

class sharedNumberFormatterWithOneDecimalPlace : NSNumberFormatter {
    class var sharedInstance: sharedNumberFormatterWithOneDecimalPlace {
    struct Singleton {
        static let instance = sharedNumberFormatterWithOneDecimalPlace()
        }
    return Singleton.instance
    }

    override init () {
        super.init()
        self.minimumIntegerDigits = 1
        self.maximumFractionDigits = 1
        self.minimumFractionDigits = 1
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

在我的其他课程中,我可以通过以下方式调用它:

NSNumberFormatter *formatter = sharedNumberFormatterWithOneDecimalPlace.sharedInstance;
NSLog(@"%@", [formatter stringFromNumber:aNumber]);

我希望能够拥有 1 类“MultipleFormatters”,我在其中设置了许多可以在各处使用的格式化程序,然后调用诸如“MultipleFormatters.OneDecimalPlace”之类的东西。 PS。我已经阅读了帖子:Using a dispatch_once singleton model in Swift
谢谢。

【问题讨论】:

标签: ios iphone swift


【解决方案1】:

我认为最好的方法是:

private let _MultipleFormattersSharedInstance = MultipleFormatters()

class MultipleFormatters {
    class var sharedInstance: MultipleFormatters {
        return _MultipleFormattersSharedInstance
    }
}

你可以使用

MultipleFormatters.sharedInstance

然后,您可以从类 MultipleFormatters 中创建所需的所有“格式化程序”作为方法,并在各处调用它们。

感谢that thing in swift

例如编辑:

假设您想要一个名为“increment”的格式化程序。我不知道你所说的格式化程序是什么意思,但这是一个愚蠢的例子。

private let _MultipleFormattersSharedInstance = MultipleFormatters()

class MultipleFormatters {
   class var sharedInstance: MultipleFormatters {
       return _MultipleFormattersSharedInstance
    }

    func increment(number: Int, amount: Int) -> Int{
       //Maybe you need something that was initialized with
       //the singleton here.
        return number + amount
    }
}

你会使用

let singleton : MultipleFormatters = MultipleFormatters.sharedInstance
let result = singleton.increment(1, amount: 25)

【讨论】:

  • 我无法完全理解这是如何工作的,你能举一个更具体/完整的例子吗?
【解决方案2】:
import Cocoa
import Foundation

class MultipleFormatters : NSNumberFormatter {
    class var oneDecimalPlace: MultipleFormatters {
    struct Singleton0 {
        static let instance = MultipleFormatters(numberOfDigits: 1)

        }
        return Singleton0.instance
    }
    class var twoDecimalPlace: MultipleFormatters {
    struct Singleton {
        static let instance = MultipleFormatters(numberOfDigits: 2)

        }
        return Singleton.instance
    }

    convenience init(numberOfDigits:Int){
        self.init()
        self.maximumFractionDigits = numberOfDigits
    }

    override init () {
        super.init()
        self.minimumIntegerDigits = 1
        self.maximumFractionDigits = 1
        self.minimumFractionDigits = 1
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

var res = MultipleFormatters.oneDecimalPlace.stringFromNumber(1.234)
var asdf = MultipleFormatters.twoDecimalPlace.stringFromNumber(1.234)

【讨论】:

    【解决方案3】:

    我的同事对此提供了帮助,这是我们认为从一个类创建一些格式化程序并且还能够为不同的数字格式化程序样式设置选项的最佳方式。

    private let _oneDecimalPlaceInstance = MultipleFormatters(minFracDigits: 1, maxFracDigits: 1)
    private let _twoDecimalPlaceInstance = MultipleFormatters(minFracDigits: 2, maxFracDigits: 2)
    
    class MultipleFormatters : NSNumberFormatter {
    
    class var oneDecimalPlace: MultipleFormatters {
        return _oneDecimalPlaceInstance
    }
    
    class var twoDecimalPlace: MultipleFormatters {
        return _twoDecimalPlaceInstance
    }
    
    convenience init(minFracDigits:Int, maxFracDigits:Int) {
        self.init()
        self.minimumIntegerDigits = 1
        self.minimumFractionDigits = minFracDigits
        self.maximumFractionDigits = maxFracDigits
    }
    
    }
    

    【讨论】:

      【解决方案4】:
      class TestClass{
          private static var instance = TestClass()
          public static func shareInstance() ->TestClass{
              return TestClass.instance
          }
      }
      
      let a1 = TestClass.shareInstance()
      let a2 = TestClass.shareInstance()
      let a3 = TestClass()
      print(a1===a2)
      print(a1===a3)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 2019-11-11
        • 2011-10-09
        相关资源
        最近更新 更多