Переменные класса еще не поддерживаются.

Я начинаю свой проект с контроллера разделенного вида в качестве начального контроллера представления и запускаю его автоматически из раскадровки.

Как правило, приложение с этим пользовательским интерфейсом имеет один и только один диспетчер разделяемых представлений как root, поэтому я создаю старую переменную в подклассе и устанавливаю ее, когда инициализация была сделал.

Поэтому я хочу попробовать это поведение со скоростью.

Я прочитал книгу руководства по языку Swift по iBook о свойствах типа (с ключевым словом static и class) и попробовал часть кода для задания:

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 говорит, что ключевое слово класса для свойств типа еще не поддерживается.

error detail in image

У вас есть решение для этого?

Ответ 1

Теперь у 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

Вложение структуры может работать очень хорошо в качестве обходного пути:

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 можно использовать так, как если бы оно было сохраненным типом.

Ответ 3

Кажется, возможно объявить переменные со статической продолжительностью хранения в области файлов (как в C):

var sharedInstance: SplitViewController? = nil

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

Ответ 4

Мой предпочтительный метод состоит в том, чтобы просто использовать частный объем файла var вне класса, а затем реализовать class/static getters и seters:

private var _classVar: Int = 0;

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

Ответ 5

Как и в Swift 1.2 (доступно с Xcode 6.3b1 и далее), поддерживаются свойства и методы класса static.

class SomeClass
{
    static var someVariable: Int = 0
}

Ответ 7

Решение, достаточно похожее на var в области файлов, но более настраиваемое и близкое к singleton, должно использовать структуру, которая поддерживает 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
}

Ответ 8

Хорошо, с решением Николая, который выполняет эту работу. Я публикую свои изменения в этом потоке для информации

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

Ответ 9

Формулировка ошибки в значительной степени подразумевает, что это будет языковой функцией в будущем.

Вы можете временно прибегнуть к объявлению переменной свойства в делетете приложения и получить ее оттуда. Не идеальный, определенно анти-шаблон, но даст вам центральное место для получения UISplitViewController при необходимости.

Ответ 10

Вы должны обернуть переменные класса внутри внутренней структурной переменной

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

Ответ 11

Попробуйте следующее:

class var instance: SplitViewController {
    return nil
}

Ответ 12

Он называется Type Property в Swift.

Вы определяете свойства типа с ключевым словом static. Для вычисляемых свойств типа для типов классов вы можете использовать ключевое слово класса, чтобы позволить подклассам переопределять реализацию суперкласса. В приведенном ниже примере показан синтаксис для хранимых и вычисленных свойств типа:

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