Static function variables in Swift

前端 未结 4 1597
鱼传尺愫
鱼传尺愫 2020-12-02 07:03

I\'m trying to figure out how to declare a static variable scoped only locally to a function in Swift.

In C, this might look something like this:

int         


        
相关标签:
4条回答
  • 2020-12-02 07:04

    Another solution

    class Myclass {
        static var timesCalled = 0
        func foo() -> Int {
            Myclass.timesCalled += 1
            return Myclass.timesCalled
        }
    }
    
    0 讨论(0)
  • 2020-12-02 07:23

    Swift 1.2 with Xcode 6.3 now supports static as expected. From the Xcode 6.3 beta release notes:

    “static” methods and properties are now allowed in classes (as an alias for “class final”). You are now allowed to declare static stored properties in classes, which have global storage and are lazily initialized on first access (like global variables). Protocols now declare type requirements as “static” requirements instead of declaring them as “class” requirements. (17198298)

    It appears that functions cannot contain static declarations (as asked in question). Instead, the declaration must be done at the class level.

    Simple example showing a static property incremented inside a class (aka static) function, although a class function is not required:

    class StaticThing
    {
        static var timesCalled = 0
    
        class func doSomething()
        {
            timesCalled++
    
            println(timesCalled)
        }
    }
    
    StaticThing.doSomething()
    StaticThing.doSomething()
    StaticThing.doSomething()
    

    Output:

    1
    2
    3
    
    0 讨论(0)
  • 2020-12-02 07:25

    I don't think Swift supports static variable without having it attached to a class/struct. Try declaring a private struct with 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
    
    0 讨论(0)
  • 2020-12-02 07:30

    Another solution

    func makeIncrementerClosure() -> () -> Int {
        var timesCalled = 0
        func incrementer() -> Int {
            timesCalled += 1
            return timesCalled
        }
        return incrementer
    }
    
    let foo = makeIncrementerClosure()
    foo()  // returns 1
    foo()  // returns 2
    
    0 讨论(0)
提交回复
热议问题