Programing

Swift의 클래스 내에서 정적 변수에 액세스

lottogame 2021. 1. 10. 16:44
반응형

Swift의 클래스 내에서 정적 변수에 액세스


ClassName.staticVaribale클래스 내에서 액세스 정적 변수에 유일한 방법은? 나는 같은 것을 원 self하지만 수업을 위해. 처럼 class.staticVariable.


이것은 Swift 5.1에서 우아하게 해결됩니다.

Self.yourConstant

참조 : https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md


비 정적 속성 / 메소드에서 정적 속성 / 메서드에 액세스하는 방법에는 두 가지가 있습니다.

  1. 질문에서 언급했듯이 속성 / 메소드 이름 앞에 다음 유형의 이름을 붙일 수 있습니다.

    class MyClass {
        static let staticProperty = 0
    
        func method() {
            print(MyClass.staticProperty)
        }
    }
    
  2. Swift 2 : 다음 을 사용할 수 있습니다 dynamicType.

    class MyClass {
        static let staticProperty = 0
    
        func method() {
            print(self.dynamicType.staticProperty)
        }
    }
    

    Swift 3 : 다음 을 사용할 수 있습니다 type(of:)(@Sea Coast of Tibet에게 감사) :

    class MyClass {
        static let staticProperty = 0
    
        func method() {
            print(type(of: self).staticProperty)
        }
    }
    

정적 속성 / 메소드 내부에있는 경우 정적 속성 / 메서드 앞에 아무것도 붙일 필요가 없습니다.

class MyClass {
    static let staticProperty = 0

    static func staticMethod() {
        print(staticProperty)
    }
}

Swift에는 Marcel의 대답이 가장 까다로운 스타일 가이드 신도 만족시킬 수있는 방법이 있습니다.

class MyClass {

    private typealias `Self` = MyClass

    static let MyConst = 5

    func printConst() {
        print(Self.MyConst)
    }
}

따라서 연결된 유형 선언에 액세스하려는 경우 프로토콜 에서처럼 Self를 사용할 수 있습니다. 나는 그것을 시도하지 않았기 때문에 Swift 1에 대해 잘 모르겠지만 Swift 2에서는 완벽하게 작동합니다.


향후 Swift 3 버전 (아직 출시 예정) Self에서는 포함하는 클래스를 참조하는 데 사용할 수 있습니다 (예, 대문자 사용). 이에 대한 제안이 수락되었지만 기능이 아직 구현되지 않았습니다.

예를 들면 :

struct CustomStruct {          
 static func staticMethod() { ... } 

 func instanceMethod() {          
   Self.staticMethod() // in the body of the type          
 }          
}

출처 : https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md


자체 참조 유형 별칭을 정의하여이 문제를 해결할 수 있습니다.

class MyClassWithALongName {
  typealias CLASS = MyClassWithALongName

  static let staticFoo = "foo"

  func someInstanceMethod() -> String {
    return CLASS.staticFoo
  }
}

스타일 가이드 신은 승인하지 않을 수 있습니다.


It looks like in Swift 4.2 the inner class and instance variable can directly access the static variable without the prefix of the class name. However, you still need the class name within a function.

class MyClass {
    static let staticProperty = 0
    let property = staticProperty //YES

    class Inner {
        func method() {
            print(staticProperty) //YES
        }
    }

    func method() {
        print(staticProperty) //NO
        print(MyClass.staticProperty) //YES
    }
}

I don't like the typealias way in this case. My workaround is:

class MyClass {

   static let myStaticConst: Int = 1
   var myStaticConst:Int {
      return type(of: self).myStaticConst
   }

   func method() {
      let i:Int = myStaticConst
   }
}

ReferenceURL : https://stackoverflow.com/questions/29952670/access-static-variables-within-class-in-swift

반응형