在使用Swift编程语言时,如何在类之间传输数据
使用Objective-C,我们可以使用方法将数据从ViewController传递到UIView类中的数组。在使用Swift编程语言时,如何在类之间传输数据
在UIView类,我们用这样的
float values[10];
-(void) getValue:(float) value index:(int) index {
values[index] = value
}
但是,当我们尝试做与雨燕类似的事情,如
var values : [CGFloat] = [10]
func getValue (value:CGFloat, index:Int) {
values [index] = value
}
我们越来越“致命错误:数组索引范围错误的“,或者如果我们使用
var values : [CGFloat] = [10]
var index = 0
func getValue (value:CGFloat) {
values.append = value
++index
}
我们没有得到错误消息,但whenev呃,我们使用setNeedsDisplay()数组值被设置为初始值,这个例子是10。
直到现在我们无法将Objective-C UIView类转换为Swift类。
是,学习一些更斯威夫特之后我找到了答案,我的问题。
在UIView类中使用静态变量是答案。
定义这样的变量在UIView类
struct StructToChange {
static var varToChange = 1
}
编写一个函数来改变UIView类变量值这样的。
func getIt (newValue:Int) {
StructToChange.varToChange = newValue
}
中的呼叫控制器类的功能这样
let valueChanger = AnyUIViewClass()
valueChanger.getIt (10)
这是你改变了变量的值,你可以在你的“覆盖用它作为参数FUNC的drawRect(RECT:的CGRect) {}“
第一:
var values : [CGFloat] = [10]
这行表示values
是CGFloat的值的变量数组当前持有的10
单个值。因此,只有索引0实际存在。
另外:
func getValue(value:CGFloat, index:Int) {
values [index] = value
}
没关系的事实,你已经把这个UIView类,从来不介意你有一个名为“的getValue”实际设置一个值法...
编辑:
我发现了一个更好的解决方案:
var values = Array<Float>(count:10, repeatedValue: 0)
func getValue(value: Float, index: Int) {
values[index] = value
}
以上是与您在问题中发布的Objective-C代码等价的直接Swift代码。
坦率地说,我认为你应该退后一步,找到更好的方法来解决你认为这个代码正在解决的问题。就目前而言,这并没有太大的意义。
你说得对,那没有任何意义,因为当为类执行一个View.setNeedsDisplay()时,所有的值都将从与Obj-C相反的数组中移除,并且我们不能绘制任何东西是个问题。 – Hope 2014-11-20 21:44:01
setNeedsDisplay()不会从您的数组中除去任何值,除非您显式覆盖该函数并将其删除。对不起,但我想你并不真正了解发生了什么,即使在最初的Obj-C代码中也是如此。 – 2014-11-20 21:49:29
祝你好运@希望不要忘记接受解决方案。 :-) – 2014-11-21 02:24:38
var values : [CGFloat] = [10]
在swift中,这将创建一个包含一个元素的CGFloat数组:10.0,而不是10个元素。 所以values.count是一个
不断阅读和学习。在对我的回答的评论中,你写道,你找到了一个不使用全局变量的解决方案......上面的解决方案使用了一个全局变量。我很高兴它适合你,希望有一天你能弄清楚真正的问题是什么。 – 2014-11-24 12:28:28
谢谢,但我的理解是实际上没有问题。在Swift中,当每次调用UIView类变量时都使用正常变量时,已创建新变量,并且新变量具有默认值。即使调用一个函数来改变变量值,它也不能被改变。事实上,我在打印函数中检查了它,它看起来像是成功地改变了,但在它之外,它又是默认值。这是与Obj-C不同的行为。 – Hope 2014-11-24 20:08:21