programing

클래스 변수가 아직 지원되지 않음

closeapi 2023. 8. 4. 23:06
반응형

클래스 변수가 아직 지원되지 않음

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

일반적으로 이 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 키워드가 아직 지원되지 않는다고 말했을 때 알게 되었습니다.

error detail in image

이것에 대한 해결책이 있었습니까?

구조체를 포함하는 것은 해결책으로 잘 작동할 수 있습니다.

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

아래 링크에서 자세히 읽어 보십시오.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html #//apple_ref/doc/uid/TP40014097-CH14-ID254

언급URL : https://stackoverflow.com/questions/24015207/class-variables-not-yet-supported

반응형