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



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

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
}

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

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

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

感谢您的任何建议!!

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

类的每个对象都有一个。 我怀疑您没有使用相同的对象来进行这两个调用。

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

编辑:基于评论

如果您编写代码

let centralInstance = CentralViewController()

您将获得一个新对象,其自己的transferredData成员最初设置为[0.0]。 您需要

  1. 获取对具有数据的同一 VC 对象的引用
  2. 将数据存储在可以取回的对象中的其他位置(因为 VC 可能已消失)

破解一些有用的东西(不推荐,但有助于理解)

  1. 您可以将transferredData移出类,使其成为实际的全局变量。 我这样做只是为了帮助您解决这个问题并了解正在发生的事情。
  2. 您也可以将其设置为静态,从而使所有 VC 共享相同的transferredData实例

当你了解发生了什么时,你可以尝试做一些更好的事情(至少把它移动到它自己的模型对象,而不是在VC中)。 下一个最简单的事情是某种单例来管理它 - 这只是一个美化的全局变量,但让你更多地走上更典型的解决方案的道路。

问题出在哪里:

$ 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没有改变,但它确实改变了。

相关内容

  • 没有找到相关文章

最新更新