【问题标题】:Arrays appended inside function not working in other class附加在函数内的数组在其他类中不起作用
【发布时间】:2015-06-28 22:41:53
【问题描述】:

我的问题是我有 4 个空数组:

var Names:[String] = []
var Amounts:[Int] = []
var Dates:[NSDate] = []
var Images:[UIImage] = []

在一个类NewPersonViewController中。

我在NewPersonViewController里面也有一个函数:

func create(){
   Names.append(nameField.text)
   Amounts.append(amountField.text.toInt()!)
   Dates.append(dateToBePaid.date)
}

当按下按钮时,我调用create()。该函数只是一个按钮动作,在NewPersonViewController 中声明。

我的问题:当我打印出不包括Images 的另一个类(位于另一个文件中)中的数组时,我得到了这个:

[]
[]
[]

是的,这就是我的输出。先感谢您。旁注:我是新来的 swift :)

【问题讨论】:

  • 首先,按照惯例,数组变量应该以小写字母开头,否则人们会认为它们是类。其次,您从哪里打印数组?其他对象实例如何获得对您已设置值的该对象实例的引用?
  • 让 NPVC = NewPersonViewController() println(NPVC.Names) println(NPVC.Amounts) println(NPVC.Dates) @Paulw11
  • 但是运行该代码的对象如何获得对 NPVC 对象的引用? (按照惯例,又应该是npvc)?
  • 让 NPVC = NewPersonViewController() 覆盖 func viewDidLoad() { super.viewDidLoad() println(NPVC.Names) println(NPVC.Amounts) println(NPVC.Dates) }@Paulw11
  • 因此,看起来您所指的 NewPersonViewController 实例不是您随后显示的实例(大概是由 segue 呈现的)。您只是创建一个新实例(将有空数组),然后打印这些空数组

标签: ios arrays xcode swift class


【解决方案1】:

除非您刚刚发布了一些玩具代码,否则您的设计似乎存在很多问题。

但是,您可能面临的具体问题是,在 Swift 中,数组是“value types”。基本上这意味着如果你传递一个数组,Swift 实际上每次都在制作副本。因此,如果您在其他班级中编辑副本 2,它不会影响您原来班级中的副本 1。

如果你只是想让你的代码工作而不用重构来处理这个问题(你真的应该重构),最简单的做法是使用 NSMutableArray 而不是 Swift 数组。 NSMutableArray 是一个类,它是一个“引用类型”。您可以到处传递它、进行更改并在任何地方使用它。因为您实际上只是传递了一个“引用”,所以只有一个数组,并且您所做的更改会随处可见。

【讨论】:

  • 它仍然不起作用,即使将数组更改为 NSMutableArray。 @user2194039 你能告诉我如何在类之间共享数组吗?
  • @richbrz,你可以尝试设置一个全局数组。但这确实不是最好的主意。根据您的项目设置方式,当您从一个过渡到另一个时,您可能希望考虑将数组从 viewController 传递到 viewController。这将使用“prepareForSegue”方法和 segue 来完成。
  • @richbrz 我现在真的无话可说。您的问题没有显示来自任一视图控制器的任何代码,也没有描述它们的显示方式或您如何在它们之间转换。就像其他人说的,如果你使用 segues(或 Storyboards),你应该使用prepareForSegue:。试试reading this
【解决方案2】:

我在这里相对较新,但是如果您将数组移出 ViewController,它们将成为 GLOBAL 变量,并且可以在任何其他 View 或 Table Controller 中访问。我刚试了一下,效果很好。

对于全局变量,我总是添加“gl_”前缀,所以我知道这是一个全局变量,这意味着需要小心使用它们。一般来说,全局变量是有风险的,恕我直言,应该节俭使用,并考虑使用它们带来的任何风险……尤其是安全风险。

在我的 ViewController.swift 文件中:


import UIKit


var gl_Names:[String] = []
var gl_Amounts:[Int] = []
var gl_Dates:[NSDate] = []
var gl_Images:[UIImage] = []


class ViewController: UIViewController {

    @IBOutlet weak var textInput1: UITextField!

    @IBOutlet weak var textInput2: UITextField!

    @IBOutlet weak var textInput3: UITextField!

etc etc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多