[xcode] 아직 지원되지 않는 클래스 변수

분할보기 컨트롤러를 초기보기 컨트롤러로 사용하여 프로젝트를 시작하고 스토리 보드에서 자동으로 시작합니다.

일반적으로이 UI를 사용하는 앱에는 루트로 분할보기 컨트롤러 가 하나만 있으므로 하위 클래스에 정적 변수 를 만들고 초기화가 완료 될 때 설정합니다.

그래서 나는이 행동을 신속하게 시도하고 싶습니다.

유형 속성 (정적 및 클래스 키워드 포함)에 대한 iBook의 Swift 프로그래밍 언어 가이드 북을 읽고 작업에 대한 코드를 시도했습니다.

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 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
    }
}


답변

내가 선호하는 방법은 클래스 외부에서 개인 파일 범위 var를 사용한 다음 클래스 / 정적 getter 및 setter를 구현하는 것입니다.

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
}