2014-08-27 38 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)