在Swift中展开可选的字符串数组

时间:2014-06-24 19:35:24

标签: swift

以下代码无法在最后一行编译:"无法找到' + ='接受提供的参数。"

如何在不更改项目类型的情况下修复代码?

class Test {
    var items:String[]?

    func process() {
        if (self.items == nil) {
            self.items = String[]()
        }

        for i in 1...5 {
            var item =  String(i)
            self.items! += item
        }
    }
}

4 个答案:

答案 0 :(得分:1)

我还没有想出一种附加到可选数组的方法。我不相信这是可能的。通过执行此操作,您可以实现与代码尝试执行的操作类似的效果:

class Test {
    @lazy var items = [String]()

    func process() {
        for i in 1...5 {
            var item =  String(i)
            self.items.append(item)
        }
    }
}

注意:我已向Apple提交了有关此问题的错误

答案 1 :(得分:1)

懒洋洋地创建它:

class Test {
  @lazy var items = String[]()
  ...
}

答案 2 :(得分:1)

以下内容将项目保留为可选数组,同时保持一般流程:

class Test {
    var items : String[]?

    func process() {
        var items = self.items ? self.items! : String[]()

        for i in 1...5 {
            var item =  String(i)
            items += item;
        }

        self.items = items
    }
}

答案 3 :(得分:0)

更新

在随Xcode 6 Beta 5提供的Swift版本中,错误已修复,代码正常运行(当然是在改编之后),这是新代码:

class Test {
    var items:[String]?

    func process() {
        if (self.items == nil) {
            self.items = [String]()
        }

        for i in 1...5 {
            var item = String(i)
            self.items!.append(item)
        }
    }
}

旧答案

<击> 我发现展开的结果是常量,而常量不能变异。因此错误“无法找到接受提供的参数的'+ ='的重载。”因为运算符'+ ='定义为:

@assignment func +=<A : ArrayType>(inout lhs: A, rhs: A._Buffer.Element)

因此,作为解决方案,您可以使用@lazy属性(根据GoZoner建议并在drewag的答案中看到)或David创建临时变量的方法。

方法1(@lazy):

取自drewag的回答

class Test {
    @lazy var items = String[]()

    func process() {
        for i in 1...5 {
            var item =  String(i)
            self.items.append(item)
        }
    }
}

方法2(临时变量):

取自David的回答

class Test {
    var items : String[]?

    func process() {
        var items = self.items ? self.items! : String[]()

        for i in 1...5 {
            var item =  String(i)
            items += item;
        }

        self.items = items
    }
}

<击>