[function] Swift의 정적 함수 변수

Swift의 함수에 로컬로만 범위가 지정된 정적 변수를 선언하는 방법을 알아 내려고합니다.

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

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

Objective-C에서는 기본적으로 동일합니다.

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

그러나 나는 Swift에서 이와 같은 것을 할 수 없습니다. 다음과 같은 방법으로 변수 선언을 시도했습니다.

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

그러나 이것들은 모두 오류를 초래합니다.

  • 첫 번째는 “정적 속성은 유형에 대해서만 선언 할 수 있습니다”라고 불평합니다.
  • 두 번째 ( “예상 선언”불평 static하다) 및 “예상 된 패턴”(여기서, timesCalledB임)
  • 세 번째는 “행의 연속 명령문은 ‘;'(콜론과 사이의 공백 static) 및”예상 유형 “(여기서는 static)으로 구분되어야합니다.
  • 네 번째는 “행의 연속 문은 ‘;'( Int와 사이의 공백 static) 및”예상 선언 “(등호 아래) 으로 구분되어야합니다.



답변

Swift는 클래스 / 구조체에 연결하지 않고 정적 변수를 지원한다고 생각하지 않습니다. 정적 변수로 개인 구조체를 선언하십시오.

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 베타 릴리스 정보에서 :

이제 “정적”메서드와 속성이 클래스에서 허용됩니다 ( “클래스 최종”의 별칭으로). 이제 전역 저장소가 있고 처음 액세스 할 때 (전역 변수와 같이) 느리게 초기화되는 클래스에서 정적 저장된 속성을 선언 할 수 있습니다. 이제 프로토콜은 유형 요구 사항을 “클래스”요구 사항으로 선언하는 대신 “정적”요구 사항으로 선언합니다. (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
    }
}


답변