Rozpoczynam projekt z kontrolerem widoku podzielonego jako początkowym kontrolerem widoku i uruchamiam go automatycznie z poziomu scenorysu.
Generalnie aplikacja z tym interfejsem użytkownika ma jeden i tylko jeden kontroler widoku podzielonego jako root, więc tworzę zmienną statyczną w podklasie i ustawiam ją po zakończeniu inicjalizacji.
Więc chcę szybko spróbować tego zachowania.
Przeczytałem podręcznik języka programowania Swift na iBook o właściwościach Type (ze słowem kluczowym static i class) i wypróbowuję fragment kodu do pracy:
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;
}
}
ale zorientowałem się, kiedy Xcode mówi, że słowo kluczowe class dla właściwości typu nie było jeszcze obsługiwane.
Czy masz rozwiązanie, aby to zrobić?
Odpowiedzi:
Swift obsługuje teraz zmienne statyczne w klasach. To nie jest dokładnie to samo, co zmienna klasy (ponieważ nie są one dziedziczone przez podklasy), ale zbliża się do niej:
class X { static let y: Int = 4 static var x: Int = 4 } println(X.x) println(X.y) X.x = 5 println(X.x)
źródło
class
słowo kluczowe może być teraz używane tylko dla obliczonych właściwości, a statyczne są dla wszystkich właściwości typu (w wyliczeniu, klasie lub struct)Osadzenie struktury może działać dobrze jako obejście:
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 } } }
Właściwość typu obliczonego SomeClass.workaroundClassVariable może być następnie używana tak, jakby była właściwością typu przechowywanego.
źródło
Wydaje się, że możliwe jest zadeklarowanie zmiennych ze statycznym czasem przechowywania w zakresie pliku (jak w C):
var sharedInstance: SplitViewController? = nil class SplitViewController: UISplitViewController { .... func initialization() { sharedInstance = self } }
źródło
private
.Moją preferowaną metodą jest po prostu użycie prywatnego zakresu pliku var poza klasą, a następnie zaimplementowanie klas / statycznych metod pobierających i ustawiających:
private var _classVar: Int = 0; class SomeClass { public class var classVar: Int { get { return _classVar } set { _classVar = newValue } } }
źródło
Począwszy od wersji Swift 1.2 (dostępnej z Xcode 6.3b1 i nowszymi)
static
obsługiwane są właściwości i metody klas.class SomeClass { static var someVariable: Int = 0 }
źródło
class
zmienną, czy też istnieje rozróżnienie (kiedyśstatic
dotyczyło struktur,class
klas)?static
podano alias dlaclass final
.Korzystanie z modelu singleton dispatch_once w języku Swift
Jak dotąd wydaje się najlepszą odpowiedzią, unikając użycia zmiennej globalnej.
źródło
Rozwiązaniem wystarczająco podobnym do var w zakresie pliku, ale bardziej konfigurowalnym i bliskim singletonowi jest użycie struktury, która obsługuje statyczną zmienną jako właściwość klasy
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 }
źródło
Ok, z rozwiązaniem Mikołaja, które wykonują pracę. Publikuję swoje zmiany w tym wątku w celach informacyjnych
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 } }
i na przykład w mojej appDelegate mogę uzyskać dostęp do tej metody statycznej w ten sposób
SplitViewController.sharedInstance()!.presentsWithGesture = false
źródło
Sformułowanie błędu w dużym stopniu sugeruje, że będzie to funkcja języka w przyszłości.
Możesz tymczasowo skorzystać z zadeklarowania zmiennej właściwości w delegacie aplikacji i pobrać ją stamtąd. Nie jest idealny, na pewno anty-wzór, ale zapewniłby centralne miejsce do odzyskania w
UISplitViewController
razie potrzeby.źródło
Musisz umieścić zmienne klasy wewnątrz wewnętrznej zmiennej strukturalnej
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
źródło
Spróbuj tego:
class var instance: SplitViewController { return nil }
źródło
Nazywa się to Type Property in Swift.
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 } }
Przeczytaj więcej pod linkiem poniżej,
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254
źródło