Я начинаю свой проект с контроллера разделения представления в качестве исходного контроллера представления и запускаю его автоматически из раскадровки.
Как правило, приложение с этим пользовательским интерфейсом имеет один и только один контроллер разделения представления в качестве корневого, поэтому я создаю статическую переменную в подклассе и устанавливаю ее при выполнении инициализации.
Итак, я хочу попробовать это поведение с быстрой скоростью.
Я прочитал руководство по языку программирования 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 говорит, что ключевое слово класса для свойств типа еще не поддерживается.
У вас было решение для этого?
Ответы:
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)
источник
class
ключевое слово теперь может использоваться только для вычисляемых свойств, а static - для всех свойств типа (в enum, class или структура)Встраивание структуры может прекрасно работать как обходной путь:
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 } }
источник
private
.Мой предпочтительный метод - просто использовать частную область видимости файла var за пределами класса, а затем реализовать методы получения и установки класса / статики:
private var _classVar: Int = 0; class SomeClass { public class var classVar: Int { get { return _classVar } set { _classVar = newValue } } }
источник
Начиная с Swift 1.2 (доступен с Xcode 6.3b1 и новее),
static
свойства и методы классов поддерживаются.class SomeClass { static var someVariable: Int = 0 }
источник
class
переменной, или есть различие (раньше былоstatic
для структур,class
для классов)?static
это псевдоним дляclass final
.Использование одноэлементной модели dispatch_once в Swift
На данный момент это кажется лучшим ответом, избегая использования глобальной переменной.
источник
Решение, достаточно похожее, чем var в области видимости файла, но более настраиваемое и близкое к синглтону, - использовать структуру, которая поддерживает статический 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 }
источник
Хорошо, с решением Николая, делаю работу. Я публикую свои изменения в этой теме для информации
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
источник
Формулировка ошибки явно подразумевает, что в будущем это будет языковая функция.
Вы можете временно прибегнуть к объявлению переменной свойства в делегате приложения и получить ее оттуда. Не идеально, определенно анти-паттерн, но даст вам центральное место для извлечения
UISplitViewController
нужного.источник
Вы должны обернуть переменные класса во внутреннюю структурную переменную
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
источник
Попробуй это:
class var instance: SplitViewController { return nil }
источник
В Swift это называется Type Property .
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
источник