클래스 변수가 아직 지원되지 않음
저는 분할 뷰 컨트롤러를 초기 뷰 컨트롤러로 프로젝트를 시작하고 스토리보드에서 자동으로 시작합니다.
일반적으로 이 UI를 사용하는 앱은 하나의 분할 뷰 컨트롤러만 루트로 가지고 있기 때문에 하위 클래스에 정적 변수를 생성하여 초기화가 완료된 시점을 설정합니다.
그래서 저는 이 행동을 빨리 시도하고 싶습니다.
iBook에서 유형 속성에 대한 Swift 프로그래밍 언어 가이드북(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에서 type properties에 대한 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 }
}
}
Some Class.해결 방법ClassVariable 계산 유형 속성을 저장된 유형 속성처럼 사용할 수 있습니다.
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)
파일 범위(C에서와 같이)에서 정적 저장 기간을 갖는 변수를 선언할 수 있습니다.
var sharedInstance: SplitViewController? = nil
class SplitViewController: UISplitViewController {
....
func initialization() {
sharedInstance = self
}
}
내가 선호하는 방법은 클래스 외부에서 개인 파일 범위 변수를 사용한 다음 클래스/정적 게터 및 세터를 구현하는 것입니다.
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
}
Swift에서 dispatch_once 싱글톤 모델 사용
글로벌 변수를 사용하지 않는 것이 지금까지 가장 좋은 답변인 것 같습니다.
파일 범위에서 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
}
}
그리고 예를 들어, 내 앱Delicate에서, 나는 이 정적인 방법에 다음과 같이 액세스할 수 있습니다.
SplitViewController.sharedInstance()!.presentsWithGesture = false
오류의 문구는 향후 이 기능이 언어 기능이 될 것임을 크게 암시합니다.
일시적으로 Application Delegate에서 속성 변수를 선언하고 여기에서 속성 변수를 검색할 수 있습니다.이상적이지는 않아요, 확실히 안티 패턴이지만, 당신에게 검색할 수 있는 중앙 위치를 제공할 것입니다.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에서는 유형 속성이라고 합니다.
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
}
}
아래 링크에서 자세히 읽어 보십시오.
언급URL : https://stackoverflow.com/questions/24015207/class-variables-not-yet-supported
'programing' 카테고리의 다른 글
PowerShell을 사용하여 XML Element 특성의 값을 변경하는 방법은 무엇입니까? (0) | 2023.08.04 |
---|---|
Oracle에서 고유 제약 조건 수정 (0) | 2023.08.04 |
다양한 수의 바인딩으로 Oracle EXECUTE Immediate를 실행할 수 있습니까? (0) | 2023.08.04 |
Twitter Bootstrap 3에서 버튼을 중앙에 배치하는 방법은? (0) | 2023.08.04 |
"AJAX"를 사용하여 CSV 파일 다운로드 (0) | 2023.08.04 |