在swift中的视图控制器之间传递完整数组

时间:2014-11-18 15:42:05

标签: arrays swift xcode6

我试图在视图控制器之间传递一个完整的数组,但无法找出丢失的部分。

在视图控制器中,我有:

protocol ExclusionsViewViewControllerDelegate{
    func ExcUpperDidFinish(controller:ExclusionsView)
    func ExcLowerDidFinish(controller:ExclusionsView)

}

class ExclusionsView: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var delegate:ExclusionsViewViewControllerDelegate? = nil
    var ExcLowerArray:[Int]=[]
    var ExcUpperArray:[Int]=[]

    @IBOutlet var ExcLowerText: UITextField!
    @IBOutlet var ExcUpperText: UITextField!
    @IBOutlet var ExcFreqTable: UITableView!

    @IBAction func BackButton(sender: AnyObject) {
         if (delegate != nil){
            delegate!.ExcUpperDidFinish(self, Array: ExcUpperArray)
            delegate!.ExcLowerDidFinish(self, Array: ExcLowerArray)
        }
        dismissViewControllerAnimated(true,completion:nil)
    }

在View控制器中,我有:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,          PreferencesViewControllerDelegate, ExclusionsViewViewControllerDelegate {

var ExcUpperFreqArray:[Int]=[]
var ExcLowerFreqArray:[Int]=[]

override func viewDidLoad() {
    super.viewDidLoad()
}

func ExcLowerDidFinish(controller: ExclusionsView, Array:[Int]) {
    ExcLowerFreqArray = Array
    controller.navigationController?.popViewControllerAnimated(true)
}
func ExcUpperDidFinish(controller: ExclusionsView, Array:[Int]) {
    ExcUpperFreqArray = Array
    controller.navigationController?.popViewControllerAnimated(true)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "pushExclusions"{
        let zc = segue.destinationViewController as ExclusionsView
        zc.ExcLowerArray = ExcLowerFreqArray
        zc.ExcUpperArray = ExcUpperFreqArray
    }
}

我无法弄清楚如何正确引用数组。我试图在视图控制器1中创建数组ExcLowerArray,当我更改视图时,它会将所有数据复制到第二个视图控制器中的数组ExcLowerFreqArray,以便我可以在该视图控制器中引用它。目前虽然我在这两行上出错:     delegate!.ExcLowerDidFinish(self,Array:ExcLowerArray)     func ExcLowerDidFinish(控制器:ExclusionsView,Array:[Int]){

1 个答案:

答案 0 :(得分:2)

Swift数组是值类型,因此它们不是通过引用而是通过值传递,这意味着在将数组传递给函数,赋值给变量等时创建副本。

为了通过引用将数组(更常见的是任何值类型)传递给函数,可以在函数声明中使用inout修饰符,并在传递时使用引用运算符&函数的参数。在你的情况下:

func ExcLowerDidFinish(controller: String, inout Array:[Int])

delegate!.ExcLowerDidFinish(self, Array: &ExcUpperArray)

偏离主题:请注意,按照惯例,swift函数/方法和变量/参数名称以小写开头,而类型(类,结构等)以大写开头。其他Swift开发人员可能难以阅读您的代码