在使用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) {}“

+0

不断阅读和学习。在对我的回答的评论中,你写道,你找到了一个不使用全局变量的解决方案......上面的解决方案使用了一个全局变量。我很高兴它适合你,希望有一天你能弄清楚真正的问题是什么。 – 2014-11-24 12:28:28

+0

谢谢,但我的理解是实际上没有问题。在Swift中,当每次调用UIView类变量时都使用正常变量时,已创建新变量,并且新变量具有默认值。即使调用一个函数来改变变量值,它也不能被改变。事实上,我在打印函数中检查了它,它看起来像是成功地改变了,但在它之外,它又是默认值。这是与Obj-C不同的行为。 – Hope 2014-11-24 20:08:21

第一:

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代码。

坦率地说,我认为你应该退后一步,找到更好的方法来解决你认为这个代码正在解决的问题。就目前而言,这并没有太大的意义。

+0

你说得对,那没有任何意义,因为当为类执行一个View.setNeedsDisplay()时,所有的值都将从与Obj-C相反的数组中移除,并且我们不能绘制任何东西是个问题。 – Hope 2014-11-20 21:44:01

+0

setNeedsDisplay()不会从您的数组中除去任何值,除非您显式覆盖该函数并将其删除。对不起,但我想你并不真正了解发生了什么,即使在最初的Obj-C代码中也是如此。 – 2014-11-20 21:49:29

+0

祝你好运@希望不要忘记接受解决方案。 :-) – 2014-11-21 02:24:38

var values : [CGFloat] = [10] 

在swift中,这将创建一个包含一个元素的CGFloat数组:10.0,而不是10个元素。 所以values.count是一个

Swift Collections