我正在尝试找出适合在Swift中使用的单例模型.到目前为止,我已经能够得到一个非线程安全模型:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Run Code Online (Sandbox Code Playgroud)
在Static结构中包装单例实例应允许单个实例在没有复杂命名方案的情况下不与单例实例发生冲突,并且它应该使事情变得相当私密.显然,这个模型不是线程安全的,所以我尝试将dispatch_once添加到整个事情中:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
static var token: dispatch_once_t = 0
}
dispatch_once(Static.token) { Static.instance = TPScopeManager() }
return Static.instance!
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到一个编译器错误dispatch_once:
无法将表达式的类型'Void'转换为'()'类型
我已经尝试了几种不同的语法变体,但它们似乎都有相同的结果:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Run Code Online (Sandbox Code Playgroud)
dispatch_once使用Swift 的正确用法是什么?我最初认为问题出在块中,因为dispatch_once错误消息,但我看的越多,我认为可能是获得() …
似乎NSDateFormatter有一个"功能"意外地咬你:如果你做一个简单的"固定"格式操作,如:
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"yyyyMMddHHmmss"];
NSString* dateStr = [fmt stringFromDate:someDate];
[fmt release];
Run Code Online (Sandbox Code Playgroud)
然后它在美国和大多数区域设置工作正常UNTIL ...将手机设置为24小时区域的人将设置中的12/24小时开关设置为12.然后上面开始将"AM"或"PM"添加到结果字符串的结尾.
(参见,例如,NSDateFormatter,我做错了什么或者这是一个错误?)
(请参阅https://developer.apple.com/library/content/qa/qa1480/_index.html)
显然苹果公司宣称这是"不好" - 破碎如设计,他们不会解决它.
规避显然是为特定区域(通常是美国)设置日期格式化程序的区域设置,但这有点乱:
NSLocale *loc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[df setLocale: loc];
[loc release];
Run Code Online (Sandbox Code Playgroud)
在onsies-twosies中并没有太糟糕,但我正在处理大约十个不同的应用程序,而我看到的第一个应用程序有43个这种情况的实例.
因此,对于宏/重写类/任何最小化改变所有内容的努力的任何聪明的想法,而不使代码模糊?(我的第一直觉是使用在init方法中设置语言环境的版本来覆盖NSDateFormatter.需要更改两行 - alloc/init行和添加的导入.)
这是我到目前为止所提出的 - 似乎适用于所有场景:
@implementation BNSDateFormatter
-(id)init {
static NSLocale* en_US_POSIX = nil;
NSDateFormatter* me = [super init];
if (en_US_POSIX == nil) {
en_US_POSIX = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
}
[me setLocale:en_US_POSIX];
return me;
}
@end …Run Code Online (Sandbox Code Playgroud) 我在iOS应用程序中遇到一些性能问题,同时将2013-12-19 00:00:00.000000格式化的日期转换为中等样式日期(Dec 25, 2014)和双倍值(epoch).根据Xcode分析器,执行此过程的两个函数(下图)占用了大约60%的执行时间
我想知道如何改进此代码,或者是否有更有效的方法来获得我需要的东西.
static func getMediumDate(dateString: String) -> (NSString)? {
// Get the: yyyy-MM-dd
let shorDate = dateString[dateString.startIndex..<dateString.startIndex.advancedBy(10)]
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US")
dateFormatter.dateFormat = "yyyy-MM-dd"
let stringFormatter = NSDateFormatter()
stringFormatter.locale = NSLocale(localeIdentifier: "en_US")
stringFormatter.dateFormat = "yyyy-MM-dd"
stringFormatter.dateStyle = .MediumStyle
let newDate = dateFormatter.dateFromString(shorDate)
if (newDate != nil){
return stringFormatter.stringFromDate(newDate!)
}else{
return nil
}
}
static func getSortDate(dateString:String) -> Double{
// Get the: yyyy-MM-dd
let shorDate = dateString[dateString.startIndex..<dateString.startIndex.advancedBy(10)]
let dateFormatter = …Run Code Online (Sandbox Code Playgroud) 在DateFormatter如下面的结构的初始化中使用a 时,缓存该格式化程序的最简洁方法是什么?
struct Entry {
let date: Date
// ...
init?(string: String) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
if let date = dateFormatter.date(from: string) {
self.date = date
} else {
return nil
}
// ...
}
}
Run Code Online (Sandbox Code Playgroud)