Swift:通过函数改变全局变量的值。

时间:2017-03-21 14:37:50

标签: arrays swift class global-variables

我正在尝试更改函数transferredData中的全局变量didTransferData(_ data: Data?)的值。我的代码如下所示:

var transferredData: [Double] = [0.0]
func didTransferData(_ data: Data?) {

        var dataArray = [CUnsignedChar](repeating:0, count: (data?.count)!)
        data?.copyBytes(to: &dataArray, count: dataArray.count)

        let dataInt = dataArray.filter({ Int(String($0)) != nil }).map({ Int(String($0))! })
        let dataDouble = dataInt.map { Double($0) }
        print("Data double: \(dataDouble)")

        transferredData = dataDouble
}

transferredData内打印didTransferData会返回正确的数组,其中包含dataDouble的所有值。但是当我稍后尝试在此功能中访问它时

func returnData() -> [Double]{
    print("return Data: \(transferredData)")
    return transferredData
}

它返回[0.0]。我不确定我是否遗漏了一些关键的东西,但我认为即使我在函数中更改全局变量的值,新值也应该可用于其他所有函数。

感谢您的任何建议!!

2 个答案:

答案 0 :(得分:2)

你说这段代码在一个类中。变量transferredData不是全局变量,而是成员变量。

班上每个对象都有一个。我怀疑你没有使用同一个对象来进行这两个调用。

您可以通过将其声明为静态来在所有对象之间共享该成员,但我认为最好保持原样并安排使用相同的对象。

编辑:基于评论

如果您编写代码

  let centralInstance = CentralViewController()

您将获得一个新对象,其最初设置为transferredData的{​​{1}}成员。你需要

  1. 获取对具有数据的同一VC对象的引用
  2. 将数据存储在您可以获取的对象中的其他位置(因为VC可能已经消失)
  3. 破解有效的东西(不推荐,但有助于理解)

    1. 您可以将[0.0]移出课堂并使其成为实际的全局变量。我这样做只是为了帮助你解决这个问题,并了解正在发生的事情。
    2. 您也可以将其设为静态,这会使所有VC共享transferredData的同一个实例
    3. 当你了解正在发生的事情时,你可以尝试做一些更好的事情(至少将它移动到自己的模型对象,而不是在VC中)。下一个最简单的事情是管理它的某种单身人士 - 这只是一个美化的全球变量,但让你更多地走向更典型的解决方案。

答案 1 :(得分:0)

问题出在哪里:

$ swift
Welcome to Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1). Type :help for assistance.
  1> var data:[Double] = [0.0] 
  2.  
  3. class MuckWithData { 
  4.  
  5.   func showData () -> [Double] { 
  6.     print ("Data: \(data)")  
  7.     return data  
  8.   }  
  9.  
 10.   func modifyData () {  
 11.     data = [1.0]  
 12.   } 
 13. }
data: [Double] = 1 value {
  [0] = 0
}
 14>  
 15> var mucked = MuckWithData()
mucked: MuckWithData = {}
 16> mucked.showData()
Data: [0.0]
$R0: [Double] = 1 value {
  [0] = 0
}
 17> mucked.modifyData()
 18> mucked.showData() 
Data: [1.0]
$R1: [Double] = 1 value {
  [0] = 1
}

可能你对dataDouble的计算实际上是[0.0],因此看起来transferredData没有改变,但确实如此。