Swift make method parameter mutable?

后端 未结 7 803
滥情空心
滥情空心 2020-12-07 17:04

How can I deal with this error without creating additional variable?

func reduceToZero(x:Int) -> Int {
    while (x != 0) {
        x = x-1            //         


        
相关标签:
7条回答
  • 2020-12-07 17:35

    In Swift you just add the var keyword before the variable name in the function declaration:

    func reduceToZero(var x:Int) -> Int { // notice the "var" keyword
        while (x != 0) {
            x = x-1            
        }
        return x
    }
    

    Refer to the subsection "Constant and Variable Parameters" in the "Functions" chapter of the Swift book (page 210 of the iBook as it is today).

    0 讨论(0)
  • 2020-12-07 17:38

    For Swift 1 and 2 (for Swift 3 see answer by achi using an inout parameter): Argument of a function in Swift is let by default so change it to var if you need to alter the value i.e,

    func reduceToZero(var x:Int) -> Int {
        while (x != 0) {
            x = x-1     
        }
        return x
    }
    
    0 讨论(0)
  • 2020-12-07 17:39

    As stated in other answers, as of Swift 3 placing var before a variable has been deprecated. Though not stated in other answers is the ability to declare an inout parameter. Think: passing in a pointer.

    func reduceToZero(_ x: inout Int) {
        while (x != 0) {
            x = x-1     
        }
    }
    
    var a = 3
    reduceToZero(&a)
    print(a) // will print '0'
    

    This can be particularly useful in recursion.

    Apple's inout declaration guidelines can be found here.

    0 讨论(0)
  • 2020-12-07 17:42

    'var' parameters are deprecated and will be removed in Swift 3. So assigning to a new parameter seems like the best way now:

    func reduceToZero(x:Int) -> Int {
        var x = x
        while (x != 0) {
            x = x-1            
        }
        return x
    }
    

    as mentioned here: 'var' parameters are deprecated and will be removed in Swift 3

    0 讨论(0)
  • 2020-12-07 17:52

    Solution using Swift5 with Functional Programming...

    func reduceToZeroFP(x:Int) -> Int {
        x == 0 ? x : reduceToZeroFP(x: x - 1)
    }
    
    0 讨论(0)
  • 2020-12-07 17:54

    There are some cases where we dont ned to use inout

    We can use something like this if you want that changes/scope to be only inside the function:

    func manipulateData(a: Int) -> Int {
        var a = a
        // ...
    }
    
    0 讨论(0)
提交回复
热议问题