尚不支持类变量

时间:2014-06-03 12:29:20

标签: xcode swift

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

通常,具有此UI的应用程序具有一个且仅一个拆分视图控制器作为root,因此我在子类中创建静态变量并在初始化时设置它完成。

所以我想用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关键字还不支持时。

error detail in image

你有解决办法吗?

12 个答案:

答案 0 :(得分:74)

嵌入结构可以很好地解决方法:

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计算类型属性,就像它是存储的类型属性一样。

答案 1 :(得分:37)

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)

答案 2 :(得分:20)

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

var sharedInstance: SplitViewController? = nil

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

答案 3 :(得分:14)

我首选的方法是在类之外使用私有文件范围var,然后实现类/静态getter和setter:

private var _classVar: Int = 0;

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

答案 4 :(得分:5)

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

class SomeClass
{
    static var someVariable: Int = 0
}

答案 5 :(得分:4)

Using a dispatch_once singleton model in Swift

到目前为止似乎是最好的答案,避免使用全局变量。

答案 6 :(得分:4)

一个足够类似于var的文件范围但更可自定义且接近单例的解决方案是使用支持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
}

答案 7 :(得分:2)

好的,尼古拉的解决方案可以完成这项工作。我在此主题中发布我的更改以获取信息

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

答案 8 :(得分:1)

错误中的措辞意味着这将是未来的语言功能。

您可能希望临时使用在Application Delegate中声明属性变量并从那里检索它。不理想,绝对是反模式,但会在需要时为您提供检索UISplitViewController的中心位置。

答案 9 :(得分:1)

您必须将类变量包装在内部结构变量

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

答案 10 :(得分:0)

试试这个:

class var instance: SplitViewController {
    return nil
}

答案 11 :(得分:0)

在Swift中称为 Type Property

  

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

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