我正在尝试找出适合在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错误消息,但我看的越多,我认为可能是获得() …
我在一周前提交了我的应用程序,今天收到了可怕的拒绝电子邮件.它告诉我我的应用程序无法被接受,因为我使用的是非公共API; 具体来说,它说,
应用程序中包含的非公共API是firstResponder.
现在,违规的API调用实际上是我在SO上找到的解决方案:
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];
Run Code Online (Sandbox Code Playgroud)
如何在屏幕上显示当前的第一响应者?我正在寻找一种不会让我的应用被拒绝的方法.
我似乎无法在文档中找到它,我想知道它是否存在于原生Swift中.例如,我可以NSTimer像这样调用类级函数:
NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: "someSelector:", userInfo: "someData", repeats: true)
Run Code Online (Sandbox Code Playgroud)
但我似乎无法找到一种方法来使用我的自定义对象,所以我可以这样称呼它:
MyCustomObject.someClassLevelFunction("someArg")
Run Code Online (Sandbox Code Playgroud)
现在,我知道我们可以将Objective-C与Swift混合使用,并且NSTimer类方法可能是该互操作性的残余.
Swift中是否存在类级函数?
如果是,我如何在Swift中定义类级别函数?
我正在尝试将以下Objective-C代码转换为Swift.在我的Objective-C代码中,有一个静态变量,它可以从类方法访问.
@implementation SomeClass
static NSMutableArray *_items;
+ (void)someMethod {
[_items removeAll];
}
@end
Run Code Online (Sandbox Code Playgroud)
因为你无法private var items = [AnyObject]()从Swift中的类函数访问这样声明的类型,所以我为它创建了一个存储属性.
class var items: [AnyObject] {
return [AnyObject]()
}
Run Code Online (Sandbox Code Playgroud)
而我正试图从类函数中调用一个方法.
class func someFunction() {
items.removeAll(keepCapacity: false)
}
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误类型'[AnyObject]'的不可变值只有名为'removeAll'的变异成员.
任何人都可以告诉我这个错误的原因是什么以及如何纠正它?
谢谢.
通过Swift编程语言,我惊讶地发现,与结构和枚举不同,类不支持存储的类型属性.
这是其他OO语言的一个共同特征,所以我认为他们有一个很好的理由决定不允许它.但我无法猜出这是什么原因,特别是因为结构(和枚举)有它们.
难道只是它是Swift的早期时代,它尚未实现吗?或者语言设计决策背后有更深层次的原因吗?
BTW,"存储类型属性"是Swift术语.在其他语言中,这些可能被称为类变量.示例代码:
struct FooStruct {
static var storedTypeProp = "struct stored property is OK"
}
FooStruct.storedTypeProp // evaluates to "struct stored property is OK"
class FooClass {
class var computedClassProp: String { return "computed class property is OK" }
// class var storedClassProp = "class property not OK" // this won't compile
}
FooClass.computedClassProp // evaluates to "computed class property is OK"
Run Code Online (Sandbox Code Playgroud)
编辑:
我现在意识到这种限制很容易解决,例如,通过使用具有存储属性的嵌套结构:
class Foo {
struct Stored {
static var prop1 = "a stored prop"
} …Run Code Online (Sandbox Code Playgroud) 我有一个快速的类,我试图在其中传递函数参数的默认值:
class SuperDuperCoolClass : UIViewController {
// declared a constant
let primaryColor : UIColor = UIColor(red: 72.0/255.0, green: 86.0/255.0, blue: 114.0/255.0, alpha: 1.0)
// compilation error at below line: SuperDuperCoolClass.Type does not have a member named 'primaryColor'
func configureCheckmarkedBullet(bullet: UIButton, color: UIColor = primaryColor){
// some cool stuff with bullet and primaryColor
}
}
Run Code Online (Sandbox Code Playgroud)
如上所述,如果我尝试使用常数作为函数参数的默认值,则编译器会抱怨以下错误:
SuperDuperCoolClass.Type does not have a member named 'primaryColor'
Run Code Online (Sandbox Code Playgroud)
但是如果我这样直接分配RHS值,它不会抱怨:-/:
func configureCheckmarkedBullet(bullet: UIButton, color: UIColor = UIColor(red: 72.0/255.0, green: 86.0/255.0, blue: 114.0/255.0, alpha: 1.0)) {
// …Run Code Online (Sandbox Code Playgroud)