Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将变量设置为视图';视图';时值不改变的s帧;s帧更改_Ios_Swift_Variables_Swift4_Cgrect - Fatal编程技术网

Ios 将变量设置为视图';视图';时值不改变的s帧;s帧更改

Ios 将变量设置为视图';视图';时值不改变的s帧;s帧更改,ios,swift,variables,swift4,cgrect,Ios,Swift,Variables,Swift4,Cgrect,我想在更改帧之前知道帧的原始值。为此,我想到: var baseViewOriginalFrame: CGRect! func changeFrame() { baseViewOriginalFrame = boxView.frame boxView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5) } 我注意到原始帧实际上是boxView的当前帧,因此我阅读并了解到originalFrame变量只存

我想在更改帧之前知道帧的原始值。为此,我想到:

var baseViewOriginalFrame: CGRect!

func changeFrame() {
   baseViewOriginalFrame = boxView.frame
   boxView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5)
}
我注意到原始帧实际上是boxView的当前帧,因此我阅读并了解到originalFrame变量只存储对象的位置


那么如何实现这一点(保存boxView的原始框架)?

这归结为引用类型和值类型之间的差异

在Swift中,当您有一个值类型的变量(链接整数、字符串等)时,该变量将保存该值。当您有一个引用类型的变量(例如类)时,它会在内存中保存对该对象的引用

这意味着,当传递值类型变量时,传递的是该变量所持有的实际数据。但当传递引用类型变量时,就是传递对该对象的引用

以下面的代码片段为例,您可以看到,当您复制一个值类型时,您得到了它的一个实际副本。创建引用类型的副本时,只需在内存中获取对同一对象的另一个引用,这意味着任何更改都会反映在另一个变量中,因为它们都引用同一个对象

// Structs are a VALUE type
struct myStruct {
    var value: Int

    init(x: Int) {
        self.value = x
    }
}

// Classes are a REFERENCE type
class myClass {
    var value: Int

    init(x: Int) {
        self.value = x
    }
}

var a = myStruct(x: 5)
var originalA = a       // This has made a copy of a, and stores it in originalA
a.value = 100

print(originalA.value)
print(a.value)

var b = myClass(x: 5)
var originalB = b       // This is still referencing the same object as the variable b.
b.value = 100

print(originalB.value)
print(b.value)
现在,对于您的具体示例,我对它为什么不起作用感到困惑,因为从我所看到的CGRect是一个结构,它是一种值类型,所以按照您的方式制作副本应该可以。事实上,我刚刚在我的一个应用程序中的一个方法末尾添加了您必须的代码,它的工作原理与您预期的完全一致:

let x = textView.frame
textView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5)
print(x)   // Prints (16.0, *83.0*, 343.0, 564.0)
print(textView.frame) // Prints (16.0, *88.0*, 343.0, 564.0)
希望这有帮助,
雅各布。

谢谢你的解释,嗯,是的,它不工作真奇怪。让我再检查一遍我的代码,看看是否能发现问题,我现在会进一步调查这个问题。好的,很高兴更新一下,它实际上是我这边的一个bug。。。我调用了错误的函数哈哈哈!谢谢