类变量暂不支持

16 浏览
0 Comments

类变量暂不支持

我希望使用精炼的语言来翻译以下内容:\n我将我的项目从故事板开始,使用分割视图控制器作为初始视图控制器,并自动启动。\n通常,拥有这种界面的应用程序只有一个且仅有一个分割视图控制器作为根视图控制器,因此我在子类中创建了一个静态变量,并在初始化完成时设置它。\n因此,我想用Swift尝试这种行为。\n我阅读了iBook上的Swift编程语言指南关于类型属性(使用static和class关键字)的部分,并尝试了一段代码:\nimport UIKit\nclass SplitViewController: UISplitViewController {\n class func sharedInstance() -> SplitViewController {\n return SplitViewController.instance\n }\n class let instance: SplitViewController = nil\n init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {\n super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)\n self.initialization()\n }\n init(coder aDecoder: NSCoder!) {\n super.init(coder: aDecoder);\n self.initialization()\n }\n func initialization() {\n SplitViewController.instance = self;\n }\n}\n\n但是我发现当Xcode提示类型属性的class关键字尚不支持时。\n\"error\n你有解决办法吗?

0
0 Comments

在Swift中,可以在文件范围内声明具有静态存储期的变量,就像在C语言中一样。但是有一个问题,当在文件范围内初始化一个静态变量时,可能会出现内存泄漏的问题。然而,实际上并没有什么需要泄漏的,除非这个实例一直存在。

在Playground中,我尝试了这个方法,但是它并没有生效。这是因为在初始化“静态”变量时,这个类还没有被声明。我还没有在Xcode项目中尝试过(我猜在那里应该可以工作)。所以我可能需要找出“类的前向声明”的方法,就像在为类指定协议时那样。

值得注意的是,在Xcode 6.0中,即使它们是私有的,也不能在文件范围内有相同名称的两个变量。

总结起来,Swift不支持在文件范围内声明的静态变量。这可能会导致在初始化时出现问题,并可能引发内存泄漏。要解决这个问题,可以尝试使用类的前向声明来确保变量在初始化时可用。

0
0 Comments

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)

“正如Bill所说,这不是完全相同的,但这正是我所需要的!”

“(和Bill)这和类变量有什么区别?”

“Apple的文档最近已更改以更新状态:developer.apple.com/library/ios/documentation/Swift/Conceptual/… 实际上,class关键字现在只能用于计算属性,而static适用于所有类型的属性(在枚举,类或结构体中)”

“正如我在回答中提到的,真正的类变量可以被子类继承。静态变量则不行。”

“苹果是否更新了文档?developer.apple.com/library/ios/documentation/Swift/Conceptual/… 看一下第四段:“对于值类型(即结构和枚举),您可以定义存储和计算的类型属性。对于类,您只能定义计算的类型属性。”

“你的答案,如果是关于Swift的,是错误的(在此时说)。类型属性,即使用static定义的属性,无论是存储的还是计算的,都会被子类继承。存储的类型属性在子类中不能被覆盖。与存储的类型属性不同,如果你使用class关键字而不是static关键字,计算的类型属性是可以被覆盖的。”

“嗯,我没有区分存储的和计算的属性...如果你读了我的回答和评论,我是在谈论static和class属性之间的区别...”

0
0 Comments

问题出现的原因是因为在Swift中,class variables(类变量)还不被支持。解决方法是通过嵌套一个struct来实现类变量的功能。

在上面的例子中,通过嵌套一个SubStruct结构体,并在其中定义一个静态变量staticVariable来代替类变量。然后,通过在SomeClass中定义一个计算属性workaroundClassVariable,来实现对staticVariable的读写操作。

这样做的好处是,我们可以像使用存储类型属性一样使用SomeClass.workaroundClassVariable计算类型属性。

但是需要注意的是,如果在一个内部类中声明一个公共类,就必须将public修饰符移除,因为XCode 6.0不支持这样的声明。

此外,如果在一个泛型类中嵌套类型,也无法使用这种方法来实现类变量的功能,因为只有计算属性是可行的。

通过嵌套一个结构体来实现类变量的功能是一个有效的解决方法,但在某些特定情况下可能会有限制。

0