source

Swift의 정적 함수 변수

lovecheck 2023. 9. 9. 09:36
반응형

Swift의 정적 함수 변수

스위프트의 함수에 대해서만 로컬 범위의 정적 변수를 선언하는 방법을 찾고 있습니다.

C에서는 다음과 같이 보일 수 있습니다.

int foo() {
    static int timesCalled = 0;
    ++timesCalled;
    return timesCalled;
}

Objective-C에서는 기본적으로 다음과 같습니다.

- (NSInteger)foo {
    static NSInteger timesCalled = 0;
    ++timesCalled;
    return timesCalled;
}

하지만 스위프트에서는 이런 일을 할 수 없을 것 같습니다.저는 다음과 같은 방법으로 변수를 선언하려고 했습니다.

static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0

그러나 이는 모두 오류를 초래합니다.

  • 첫 번째 불만 사항은 "Static properties는 유형에만 선언될 수 있습니다."입니다.
  • 두 번째 불만 사항은 "예상 선언"(여기서)입니다.staticis) 및 "예상 패턴"(여기서)timesCalledBis)
  • 세 번째 불만 사항은 "한 줄 위의 연속된 문장은 ';'로 구분해야 합니다."(대장과 대장 사이의 공간에서)static) 및 "예상 유형"(여기서)staticis)
  • 네 번째 불만 사항은 "한 라인의 연속된 문장은 ';'로 구분해야 합니다."(사이의 공간)Int그리고.static) 및 "예상 선언"(등호 아래)

swift는 static variable을 클래스/구조물에 부착하지 않고는 지원하지 않는다고 생각합니다.정적 변수가 있는 개인 구조를 선언해 봅니다.

func foo() -> Int {
    struct Holder {
        static var timesCalled = 0
    }
    Holder.timesCalled += 1
    return Holder.timesCalled
}

  7> foo()
$R0: Int = 1
  8> foo()
$R1: Int = 2
  9> foo()
$R2: Int = 3

다른해법

func makeIncrementerClosure() -> () -> Int {
    var timesCalled = 0
    func incrementer() -> Int {
        timesCalled += 1
        return timesCalled
    }
    return incrementer
}

let foo = makeIncrementerClosure()
foo()  // returns 1
foo()  // returns 2

Xcode 6.3을 탑재한 Swift 1.2는 예상대로 정적을 지원합니다.Xcode 6.3 베타 릴리즈 노트에서:

이제 클래스에서 "static" 메서드 및 속성이 허용됩니다("class final"의 별칭으로 사용).이제 클래스에서 정적 저장 속성을 선언할 수 있습니다. 클래스에는 전역 저장이 있고 첫 번째 액세스 시 느리게 초기화됩니다(글로벌 변수와 같이).이제 프로토콜은 형식 요건을 "클래스" 요건으로 선언하는 대신 "스태틱" 요건으로 선언합니다(17198298).

함수에 정적 선언이 포함될 수 없는 것으로 보입니다(문제의 질문에 있음).대신, 신고는 학급 단위로 해야 합니다.

클래스 함수가 필요하지는 않지만 클래스(일명 정적) 함수 내부에서 증가하는 정적 속성을 보여주는 간단한 예:

class StaticThing
{
    static var timesCalled = 0

    class func doSomething()
    {
        timesCalled++

        println(timesCalled)
    }
}

StaticThing.doSomething()
StaticThing.doSomething()
StaticThing.doSomething()

출력:

1
2
3

다른해법

class Myclass {
    static var timesCalled = 0
    func foo() -> Int {
        Myclass.timesCalled += 1
        return Myclass.timesCalled
    }
}

언급URL : https://stackoverflow.com/questions/25354882/static-function-variables-in-swift

반응형