在Swift中有选择地将类的属性传递给类方法

时间:2017-03-27 10:31:37

标签: swift class methods parameters

struct Bar
{
    var one:[Int] = []
    var two:[Int] = []
    var tri:[Int] = []
}

class foo
{
    var bar = Bar()

    func setupBar()
    {
        bar.one = [1]
        bar.two = [2,2]
        bar.tri = [3,3,3]
    }

    //bars are updated here
    func updateBars()
    {
        updateBar(bar.one, bar.two) //...here...
        updateBar(bar.two, bar.tri) //...here...
        //etc...
    }

    //Bar1 should be concatenated with Bar2, and thus Bar1 will be updated.
    func updateBar(_bar1:[Int], _bar2:[Int]) //...here...
    {

    }

在上面的例子中,updateBar方法的参数在定义和调用中的正确语法是什么?

我尝试使用inout,但它也没有用。

2 个答案:

答案 0 :(得分:1)

您正在使用inout的正确轨道,只是不要忘记在呼叫时&

所以,声明这样的函数:

func updateBar(_ bar1: inout [Int], _ bar2:[Int])

并且这样打电话:

updateBar(&bar.one, bar.two)

我还提了一些代码:

struct Bar
{
    var one:[Int] = []
    var two:[Int] = []
    var tri:[Int] = []
}

class foo
{
    var bar = Bar()

    func setupBar()
    {
        bar.one = [1]
        bar.two = [2,2]
        bar.tri = [3,3,3]
    }

    //bars are updated here
    func updateBars()
    {
        updateBar(&bar.one, bar.two) //...here...
        updateBar(&bar.two, bar.tri) //...here...
    }

    //Bar1 should be concatenated with Bar2, and thus Bar1 will be updated.
    func updateBar(_ bar1: inout [Int], _ bar2:[Int]) //...here...
    {
        bar1.append(contentsOf: bar2)
    }
}

let f = foo()
f.setupBar()
f.updateBars()

答案 1 :(得分:0)

函数参数具有参数标签参数名称。如果您未指定参数标签,则调用函数必须使用参数名称来指定参数。所以,如果你定义

func updateBar(bar1:[Int], bar2:[Int]){}

你必须像这样调用你的函数:

updateBar(bar1: bar.one, bar2: bar.two)
# in your case you should have called updateBar(_bar1: bar.one, _bar2: bar.two)

如果要在调用函数中省略参数标签,则应使用_将其明确标记为省略:

func updateBar(_ bar1: [Int], _ bar2: [Int]){}  # note space between _ and bar1

现在你可以在没有参数标签的情况下调用你的函数:

updateBar(bar.one, bar.two)