我正在尝试更改函数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]
。 您需要
- 获取对具有数据的同一 VC 对象的引用
- 将数据存储在可以取回的对象中的其他位置(因为 VC 可能已消失)
破解一些有用的东西(不推荐,但有助于理解)
- 您可以将
transferredData
移出类,使其成为实际的全局变量。 我这样做只是为了帮助您解决这个问题并了解正在发生的事情。 - 您也可以将其设置为静态,从而使所有 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
没有改变,但它确实改变了。