2014-08-27 73 views
1

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

我希望能有1类“MultipleFormatters”在那里我设置一个习惯遍布许多格式化放置,然后调用诸如“MultipleFormatters.OneDecimalPlace”之类的东西。 PS。我已阅读帖子:Using a dispatch_once singleton model in Swift
谢谢。

+0

[在迅速调度\ _once单模型(http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift) – Shmidt 2014-08-27 13:29:29

回答

7
在我看来

最好的办法是:

private let _MultipleFormattersSharedInstance = MultipleFormatters() 

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

,你可以使用

MultipleFormatters.sharedInstance 

然后你就可以创建你需要尽可能的方法从你的类MultipleFormatters所有的“格式化”,并呼吁他们到处都是。

由于that thing in swift

编辑例如:

比方说,你想有一个被称为 “增量” 格式。我不知道格式化程序的含义,但这是一个愚蠢的例子。

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) 
+0

我不能的可能重复要充分掌握这个方法的工作原理,你能否提出一个更具体的例子? – 2014-08-27 14:56:14

+1

当然,看我的编辑! – Starscream 2014-08-28 07:34:01

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) 
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 
} 

} 
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)