我使用拆分视图控制器作为初始视图控制器开始我的项目,并从故事板自动启动它.
一般地,通过该用户界面的应用程序有一个且只有一个拆分视图控制器作为根,所以我创建一个静态变量在子类,并将其设置初始化已完成时.
所以我想用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说不支持类型属性的class关键字时,我想通了.
你有解决方案吗?
从Swift 1.2(Xcode 6.3b1及更高版本开始)开始,static
支持类属性和方法.
class SomeClass { static var someVariable: Int = 0 }
我首选的方法是在类之外使用私有文件范围var,然后实现类/静态getter和setter:
private var _classVar: Int = 0; class SomeClass { public class var classVar: Int { get { return _classVar } set { _classVar = newValue } } }
嵌入结构可以很好地解决方法:
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计算类型属性,就好像它是存储的类型属性一样.
似乎可以在文件范围内声明具有静态存储持续时间的变量(如C中所示):
var sharedInstance: SplitViewController? = nil class SplitViewController: UISplitViewController { .... func initialization() { sharedInstance = self } }
Swift现在支持类中的静态变量.这与类变量不完全相同(因为它们不是由子类继承的),但它会让你非常接近:
class X { static let y: Int = 4 static var x: Int = 4 } println(X.x) println(X.y) X.x = 5 println(X.x)