尚未支持的类variables

我以分割视图控制器作为初始视图控制器开始我的项目,并从故事板自动启动它。

通常,具有此UI的应用程序具有唯一的一个以视图控制器为根的分割视图控制器,所以我在子类中创build一个静态variables ,并在初始化完成时对其进行设置。

所以我想用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; } } 

但我想通过Xcode说types属性的类关键字尚不支持。

图像中的错误细节

你有解决scheme吗?

Swift现在支持类中的静态variables。 这与一个类variables不完全相同(因为它们不是由子类inheritance),但它让你非常接近:

 class X { static let y: Int = 4 static var x: Int = 4 } println(Xx) println(Xy) Xx = 5 println(Xx) 

作为一种解决方法,embedded结构可以很好地工作:

 class SomeClass { // class var classVariable: Int = 0 // "Class variables not yet supported." Weird. // Workaround: private struct SubStruct { static var staticVariable: Int = 0 } class var workaroundClassVariable: Int { get { return SubStruct.staticVariable } set { SubStruct.staticVariable = newValue } } } 

然后可以使用SomeClass.workaroundClassVariable计算types属性,就好像它是一个存储的types属性。

似乎可以在文件范围中声明具有静态存储持续时间的variables(如C中所示):

 var sharedInstance: SplitViewController? = nil class SplitViewController: UISplitViewController { .... func initialization() { sharedInstance = self } } 

我最喜欢的方法是在类的外部使用私有文件作用域var,然后实现类/静态获取器和设置器:

 private var _classVar: Int = 0; class SomeClass { public class var classVar: Int { get { return _classVar } set { _classVar = newValue } } } 

从Swift 1.2(Xcode 6.3b1及更高版本可用)开始,支持static类属性和方法。

 class SomeClass { static var someVariable: Int = 0 } 

在Swift中使用dispatch_once单例模型

似乎是迄今为止最好的答案,避免使用全局variables。

一个足够类似于文件范围中的var的解决scheme,但是更多的可定制和接近单例的方法是使用一个支持static var作为类的属性的结构

 struct PersonSharedData { static var backstore = "" var data: String { get { return PersonSharedData.backstore } set { PersonSharedData.backstore = newValue } } } class Person { var shared=PersonSharedData() //<< pseudo class var var family: String { get { return shared.data } set { shared.data=newValue } } var firstname = "" var lastname = "" var sexe: Sexe = .Unknown } 

好吧,用尼古拉的解决scheme来完成这项工作。 我发布我的更改在这个线程的信息

 var instance: SplitViewController? = nil class SplitViewController: UISplitViewController { class func sharedInstance() -> SplitViewController? { return instance; } 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() { instance = self } } 

例如,在我的appDelegate中,我可以像这样访问这个静态方法

 SplitViewController.sharedInstance()!.presentsWithGesture = false 

错误中的措辞严重意味着这将成为未来的语言特征。

您可能需要暂时在“应用程序委托”中声明一个属性variables,然后从那里检索它。 不理想,绝对是一个反模式,但会给你一个中心位置来检索UISplitViewController在需要的时候。

您必须将类variables包装在内部结构variables中

 class Store{ var name:String var address:String var lat:Int var long:Int init(name:String, address:String, lat:Int, long:Int){ self.name = name self.address = address self.lat = lat self.long=long } private struct FACTORY_INITIALIZED_FLAG { static var initialized: Bool = false static var myStoreList:[Store]? static func getMyStoreList()->[Store]{ if !initialized{ println("INITIALIZING") myStoreList = [ Store(name: "Walmart", address: "abcd", lat: 10, long: 20), Store(name: "JCPenny", address: "kjfnv", lat: 23, long: 34) ] initialized = true } return myStoreList! } } } var a = Store.FACTORY_INITIALIZED_FLAG.getMyStoreList() var b = Store.FACTORY_INITIALIZED_FLAG.getMyStoreList() // only prints INITIALIZING once 

尝试这个:

 class var instance: SplitViewController { return nil } 

它在Swift中被称为types属性

您可以使用static关键字定义types属性。 对于类types的计算types属性,您可以使用class关键字来替代子类来覆盖超类的实现。 下面的例子显示了存储和计算types属性的语法:

 struct SomeStructure { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 1 } } enum SomeEnumeration { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 6 } } class SomeClass { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 27 } class var overrideableComputedTypeProperty: Int { return 107 } } 

阅读更多在下面的链接,

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254