我使用拆分视图控制器作为初始视图控制器开始我的项目,并从故事板自动启动它.
一般地,通过该用户界面的应用程序有一个且只有一个拆分视图控制器作为根,所以我创建一个静态变量在子类,并将其设置初始化已完成时.
所以我想用swift试试这个行为.
我在iBook上阅读了关于Type属性(带有static和class关键字)的Swift编程语言指南,并尝试了一段代码:
import UIKit
class SplitViewController: UISplitViewController {
class func sharedInstance() -> SplitViewController {
return SplitViewController.instance
}
class let instance: SplitViewController = nil
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.initialization()
}
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder);
self.initialization()
}
func initialization() {
SplitViewController.instance = self;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当Xcode说不支持类型属性的class关键字时,我想通了.

你有解决方案吗?
它也知道,创造NSDateFormatters是" 昂贵 "
甚至Apple的数据格式指南(2014-02更新)都声明:
创建日期格式化程序并不是一个便宜的操作.如果您可能经常使用格式化程序,则缓存单个实例通常比创建和处理多个实例更有效.一种方法是使用静态变量.
但是这个文档看起来并不是最新的swift,我在最新的NSDateFormatter类参考中也找不到关于缓存格式化程序的任何内容,因此我只能假设它对于swift和Objective-c一样昂贵.
很多消息来源建议使用它来缓存类中的格式化程序,例如控制器或视图.
我想知道将单例类添加到项目中以存储日期选择器是否方便甚至"更便宜",因此您可以放心,它永远不必再次创建它.这可以在应用程序的任何地方使用.您还可以创建包含多个日期选择器的多个共享实例.例如,一个用于显示日期的日期选择器和一个用于时间表示法的日期选择器:
class DateformatterManager {
var formatter = NSDateFormatter()
class var dateFormatManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
// date shown as date in some tableviews
Static.instance.formatter.dateFormat = "yyyy-MM-dd"
return Static.instance
}
class var timeFormatManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
// date shown as time in some tableviews
Static.instance.formatter.dateFormat …Run Code Online (Sandbox Code Playgroud) 我想每个实例只运行一次代码块.
我可以将dispatch_once_t谓词声明为成员变量而不是静态变量吗?
从GCD参考资料中,我不清楚.
谓词必须指向存储在全局或静态范围内的变量.使用具有自动或动态存储的谓词的结果是未定义的.
我知道我可以使用dispatch_semaphore_t和一个布尔标志来做同样的事情.我只是好奇.
我是新手,对Objective-C非常不熟悉.有人可以帮我把它转换成Swift吗?我从Ray Wenderlich最好的iOS实践中获得了这段代码 - http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks
你会把这段代码放在哪里?它会进入一个充满全局变量的类文件吗?
- (NSDateFormatter *)formatter {
static NSDateFormatter *formatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_formatter = [[NSDateFormatter alloc] init];
_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy"; // twitter date format
});
return formatter;
}
Run Code Online (Sandbox Code Playgroud) 我dispatch_once_t在迁移到Swift 3 时遇到了麻烦.
根据Apple的迁移指南:
Swift中不再提供免费函数dispatch_once.在Swift中,您可以使用延迟初始化的全局变量或静态属性,并获得与提供的dispatch_once相同的线程安全性和一次性保证.例:
let myGlobal = { … global contains initialization in a call to a closure … }()
_ = myGlobal // using myGlobal will invoke the initialization code only the first time it is used.
所以我想迁移这段代码.所以它是在迁移之前:
class var sharedInstance: CarsConfigurator
{
struct Static {
static var instance: CarsConfigurator?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = CarsConfigurator()
}
return Static.instance!
}
Run Code Online (Sandbox Code Playgroud)
迁移后,遵循Apple的指导原则(手动迁移),代码如下所示:
class var sharedInstance: CarsConfigurator
{
struct Static …Run Code Online (Sandbox Code Playgroud) 我正在以快速有效的方式学习Singleton模式来创建Singleton类,并找到了如下创建的最佳方法.
class SingletonClass{
static let sharedInstance = SingletonClass()
}
Run Code Online (Sandbox Code Playgroud)
由于我使用了该let语句,因此它是只读属性,并且必须是线程安全的,所以不需要dispatch_once(),因为目标C.And static 用于使sharedInstance变量作为class变量我猜.
但是,这如何保证整个应用程序中只创建了一个实例?我缺少一件小事吗?
我有多个视图控制器需要获取用户的位置,所以我想创建一个单独的类,ViewControllers可以调用该类来获取用户的最新位置.
locationManager:didUpdateToLocation:fromLocation返回void.一旦计算出用户的纬度和经度,我如何将纬度和经度数据传回我的ViewControllers?
我可以尝试在我的locationManaging类中编写getter和setter,但是如果我这样做,我怎么知道何时从我的ViewController类中调用latitude getter和longitude getter方法?如何保持ViewController的主线程等待来自locationManaging类的纬度和经度值?
谢谢!
我创建一个像这样的单例:
class MyManager {
private static let sharedInstance = MyManager()
class var sharedManager : MyManager {
return sharedInstance
}
}
Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经看到了这些问题的答案(1,2,3)建议使用GCD是dispatch_once这样的:
var token: dispatch_once_t = 0
func test() {
dispatch_once(&token) {
print("This is printed only on the first call to test()")
}
print("This is printed for each call to test()")
}
test()
Run Code Online (Sandbox Code Playgroud)
输出:
This is printed only on the first call to test()
This is printed for each call to test()
Run Code Online (Sandbox Code Playgroud)
但是等一下.token是一个变量,所以我可以很容易地做到这一点:
var token: dispatch_once_t = 0
func test() {
dispatch_once(&token) {
print("This is printed only on the first call …Run Code Online (Sandbox Code Playgroud) 是否有一个如何在Swift中使用dispatch_once的例子?(最好是Apple的一个.)
注意:在这种情况下,我不会将它用于单身人士 ; 我想只运行一次任意代码.
更新:我主要对在实例方法中使用它时推荐的约定感兴趣,但是在类方法,函数和全局上下文中的使用对于完整性是有用的.