我已经成功地在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
感谢。
答案 0 :(得分:7)
我认为最好的方法是:
private let _MultipleFormattersSharedInstance = MultipleFormatters()
class MultipleFormatters {
class var sharedInstance: MultipleFormatters {
return _MultipleFormattersSharedInstance
}
}
你可以使用
MultipleFormatters.sharedInstance
然后,您可以创建所需的所有“格式化程序”作为MultipleFormatters类中的方法,并在整个地方调用它们。
编辑例如:
假设你想要一个名为“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)