Переменные класса еще не поддерживаются.
Я начинаю свой проект с контроллера разделенного вида в качестве начального контроллера представления и запускаю его автоматически из раскадровки.
Как правило, приложение с этим пользовательским интерфейсом имеет один и только один диспетчер разделяемых представлений как 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
}
Ответ 6
Использование модели singleton dispatch_once в Swift
Кажется, это лучший ответ, избегая использования глобальной переменной.
Ответ 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