在Swift中创建单例

时间:2014-08-27 13:15:10

标签: ios iphone swift

我已经成功地在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]);

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

4 个答案:

答案 0 :(得分:7)

我认为最好的方法是:

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)

答案 1 :(得分:1)

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)

答案 2 :(得分:0)

我的同事帮忙解决了这个问题,我们认为这是从一个类创建一些格式化程序的最佳方法,也可以为不同的格式化程序样式设置选项。

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
}

}

答案 3 :(得分:0)

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)